00001
00002
00003 #include "WinAudioTool.h"
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 using namespace jbxl;
00014 using namespace jbxwl;
00015
00016
00017 CWinAudioTool::CWinAudioTool(void)
00018 {
00019 m_audioStream = NULL;
00020 m_audioMedia = NULL;
00021 m_audioProperty = NULL;
00022 m_pStream = NULL;
00023
00024
00025 init();
00026 }
00027
00028
00029
00030 CWinAudioTool::~CWinAudioTool(void)
00031 {
00032 DEBUG_INFO("DESTRUCTOR: CWinAudioTool: START\n");
00033
00034 free();
00035
00036 DEBUG_INFO("DESTRUCTOR: CWinAudioTool: END\n");
00037 }
00038
00039
00040
00041 BOOL CWinAudioTool::init(void)
00042 {
00043 free();
00044
00045
00046
00047
00048
00049 BOOL 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 return FALSE;
00057 }
00058
00059
00060
00061 void CWinAudioTool::free(void)
00062 {
00063 releaseNull(m_pStream);
00064 deleteNull (m_audioStream);
00065
00066 releaseNull(m_audioProperty);
00067 releaseNull(m_audioMedia);
00068 }
00069
00070
00071
00072 BOOL CWinAudioTool::setMediaType(void)
00073 {
00074 if (m_audioMedia==NULL) return FALSE;
00075
00076 DMO_MEDIA_TYPE mt = {0};
00077 MoInitMediaType(&mt, sizeof(WAVEFORMATEX));
00078 mt.majortype = MEDIATYPE_Audio;
00079 mt.subtype = MEDIASUBTYPE_PCM;
00080 mt.lSampleSize = 0;
00081 mt.bFixedSizeSamples = TRUE;
00082 mt.bTemporalCompression = FALSE;
00083 mt.formattype = FORMAT_WaveFormatEx;
00084 memcpy(mt.pbFormat, &getAudioFormat(), sizeof(WAVEFORMATEX));
00085
00086 HRESULT hr = m_audioMedia->SetOutputType(0, &mt, 0);
00087 MoFreeMediaType(&mt);
00088
00089 if (FAILED(hr)) return FALSE;
00090 return TRUE;
00091
00092
00093 if (SUCCEEDED(hr)) {
00094 m_audioStream = new CWinAudioStream(m_audioMedia);
00095 m_audioStream->QueryInterface(IID_IStream, (void**)&m_pStream);
00096 }
00097 }
00098
00099
00100
00101 void CWinAudioTool::getAudioData(Buffer* pbuf)
00102 {
00103 if (m_pStream==NULL || pbuf==NULL) return;
00104
00105 ULONG len = 0;
00106
00107 m_pStream->Read((void*)pbuf->buf, (ULONG)pbuf->bufsz, &len);
00108 pbuf->vldsz = (int)len;
00109
00110 return;
00111 }
00112
00113
00114
00115 WAVEFORMATEX CWinAudioTool::getAudioFormat(void)
00116 {
00117 WORD blockAlign = ((WinAudioToolBitsPerSample+7)/8)*WinAudioToolChannels;
00118 DWORD avgBytesPerSec = blockAlign*WinAudioToolSamplesPerSec;
00119
00120 WAVEFORMATEX format = {
00121 WinAudioToolFormat, WinAudioToolChannels, WinAudioToolSamplesPerSec,
00122 avgBytesPerSec, blockAlign, WinAudioToolBitsPerSample, 0
00123 };
00124 return format;
00125 }
00126
00127