00001
00002
00003 #include "KinectAudio.h"
00004
00005
00006 #ifdef ENABLE_KINECT_SDK
00007
00008
00009 using namespace jbxl;
00010 using namespace jbxwl;
00011
00012
00013 CKinectAudio::CKinectAudio(INuiSensor* sensor, int mode)
00014 {
00015 m_audioStream = NULL;
00016 m_audioSource = NULL;
00017 m_audioMedia = NULL;
00018 m_audioProperty = NULL;
00019 m_pStream = NULL;
00020
00021
00022 if (sensor!=NULL) init(sensor, mode);
00023 }
00024
00025
00026
00027 CKinectAudio::~CKinectAudio(void)
00028 {
00029 DEBUG_INFO("DESTRUCTOR: CKinectAudio: START\n");
00030
00031 free();
00032
00033 DEBUG_INFO("DESTRUCTOR: CKinectAudio: END\n");
00034 }
00035
00036
00037
00038 BOOL CKinectAudio::init(INuiSensor* sensor, int mode)
00039 {
00040 free();
00041
00042 if (sensor!=NULL) {
00043 HRESULT hr = sensor->NuiGetAudioSource(&m_audioSource);
00044 if (SUCCEEDED(hr)) hr = m_audioSource->QueryInterface(IID_IMediaObject, (void**)&m_audioMedia);
00045 if (SUCCEEDED(hr)) hr = m_audioSource->QueryInterface(IID_IPropertyStore, (void**)&m_audioProperty);
00046
00047 if (SUCCEEDED(hr)) {
00048 BOOL ret = setProperty(mode);
00049 if (ret) ret = setMediaType();
00050 if (ret) {
00051 m_audioStream = new CWinAudioStream(m_audioMedia);
00052 m_audioStream->QueryInterface(IID_IStream, (void**)&m_pStream);
00053 return TRUE;
00054 }
00055 }
00056 }
00057 return FALSE;
00058 }
00059
00060
00061
00062 void CKinectAudio::free(void)
00063 {
00064 releaseNull(m_pStream);
00065 deleteNull (m_audioStream);
00066
00067 releaseNull(m_audioProperty);
00068 releaseNull(m_audioMedia);
00069 releaseNull(m_audioSource);
00070 }
00071
00072
00073
00083 BOOL CKinectAudio::setProperty(int mode)
00084 {
00085 if (m_audioProperty==NULL) return FALSE;
00086
00087 PROPVARIANT prop;
00088
00089 PropVariantInit(&prop);
00090 prop.vt = VT_I4;
00091 prop.lVal = (LONG)mode;
00092 m_audioProperty->SetValue(MFPKEY_WMAAECMA_SYSTEM_MODE, prop);
00093 PropVariantClear(&prop);
00094
00095 return TRUE;
00096 }
00097
00098
00099
00100 BOOL CKinectAudio::setMediaType(void)
00101 {
00102 if (m_audioMedia==NULL) return FALSE;
00103
00104 DMO_MEDIA_TYPE mt = {0};
00105 MoInitMediaType(&mt, sizeof(WAVEFORMATEX));
00106 mt.majortype = MEDIATYPE_Audio;
00107 mt.subtype = MEDIASUBTYPE_PCM;
00108 mt.lSampleSize = 0;
00109 mt.bFixedSizeSamples = TRUE;
00110 mt.bTemporalCompression = FALSE;
00111 mt.formattype = FORMAT_WaveFormatEx;
00112 memcpy(mt.pbFormat, &getAudioFormat(), sizeof(WAVEFORMATEX));
00113
00114 HRESULT hr = m_audioMedia->SetOutputType(0, &mt, 0);
00115 MoFreeMediaType(&mt);
00116
00117 if (FAILED(hr)) return FALSE;
00118 return TRUE;
00119 }
00120
00121
00122
00123 void CKinectAudio::getAudioData(Buffer* pbuf)
00124 {
00125 if (m_pStream==NULL || pbuf==NULL) return;
00126
00127 ULONG len = 0;
00128
00129 m_pStream->Read((void*)pbuf->buf, (ULONG)pbuf->bufsz, &len);
00130 pbuf->vldsz = (int)len;
00131
00132 return;
00133 }
00134
00135
00136
00137 WAVEFORMATEX CKinectAudio::getAudioFormat(void)
00138 {
00139 WORD blockAlign = ((KinectAudioBitsPerSample+7)/8)*KinectAudioChannels;
00140 DWORD avgBytesPerSec = blockAlign*KinectAudioSamplesPerSec;
00141
00142 WAVEFORMATEX format = {
00143 KinectAudioFormat, KinectAudioChannels, KinectAudioSamplesPerSec,
00144 avgBytesPerSec, blockAlign, KinectAudioBitsPerSample, 0
00145 };
00146 return format;
00147 }
00148
00149
00150 #endif // ENABLE_KINECT_SDK
00151
00152