616}[aKeP |
15.08.2012 21:36 |
Ответ: Wav файл, XAudio2 и белый шум. Проблема(
Тогда вот впринципе код, файл проверял, частота, битрейт совпадает(при дебаге смотрел). Что не так не знаю(
PHP код:
#include"windows.h" #include<string> #include"XAudio2.h" struct sWavHeader { // WAV-формат начинается с RIFF-заголовка: // Содержит символы "RIFF" в ASCII кодировке // (0x52494646 в big-endian представлении) char m_cChunkId[4]; // 36 + subchunk2Size, или более точно: // 4 + (8 + subchunk1Size) + (8 + subchunk2Size) // Это оставшийся размер цепочки, начиная с этой позиции. // Иначе говоря, это размер файла - 8, то есть, // исключены поля chunkId и chunkSize. DWORD m_dwChunkSize; // Содержит символы "WAVE" // (0x57415645 в big-endian представлении) char m_cFormat[4]; // Формат "WAVE" состоит из двух подцепочек: "fmt " и "data": // Подцепочка "fmt " описывает формат звуковых данных: // Содержит символы "fmt " // (0x666d7420 в big-endian представлении) char m_cSubchunk1Id[4]; // 16 для формата PCM. // Это оставшийся размер подцепочки, начиная с этой позиции. DWORD m_dwSubchunk1Size; // Аудио формат, полный список можно получить здесь http://audiocoding.ru/wav_formats.txt // Для PCM = 1 (то есть, Линейное квантование). // Значения, отличающиеся от 1, обозначают некоторый формат сжатия. WORD m_wAudioFormat; // Количество каналов. Моно = 1, Стерео = 2 и т.д. WORD m_wNumChannels; // Частота дискретизации. 8000 Гц, 44100 Гц и т.д. DWORD m_dwSampleRate; // sampleRate * numChannels * bitsPerSample/8 DWORD m_dwByteRate; // numChannels * bitsPerSample/8 // Количество байт для одного сэмпла, включая все каналы. WORD m_wBlockAlign; // Так называемая "глубиная" или точность звучания. 8 бит, 16 бит и т.д. WORD m_wBitsPerSample; // Подцепочка "data" содержит аудио-данные и их размер. // Содержит символы "data" // (0x64617461 в big-endian представлении) char m_cSubchunk2Id[4]; // numSamples * numChannels * bitsPerSample/8 // Количество байт в области данных. DWORD m_dwSubchunk2Size; // Далее следуют непосредственно Wav данные. }; //Заголовок wav файла WAVEFORMATEX g_sDataDesc; //Интерфейс звука IXAudio2SourceVoice* g_pSource; //Буффер и информация о аудио данных для интерфейса XAUDIO2_BUFFER g_sBuffer; //Основной аудио интерфейс IXAudio2* g_pAudio; //Основной голос IXAudio2MasteringVoice* g_pMasteringVoice; //Хендл файла HANDLE v_hFile; //Структура загаловка wav файла sWavHeader v_sWavHeader; //Буффер данных из файла BYTE* g_pBuffer; //Считаные байты DWORD v_dwReadBytes; int __stdcall WinMain(HINSTANCE a_hInstance, HINSTANCE a_hPrevInstance, LPSTR a_pCmdLine, int a_iCmdShow) { CoInitializeEx(0,COINIT_MULTITHREADED); if(FAILED(XAudio2Create(&g_pAudio))) { MessageBox(NULL, "Can't create main audio interface.", "Error", MB_OK); return false; } g_pAudio->CreateMasteringVoice(&g_pMasteringVoice); //Открываем файл и считываем информацию об аудио файле v_hFile=CreateFile("Grom.wav",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,NULL,0); ReadFile(v_hFile,(void*)&v_sWavHeader,sizeof(sWavHeader),&v_dwReadBytes,NULL); //Выделяю память под буффер g_pBuffer=new BYTE[v_sWavHeader.m_dwChunkSize-36]; //Считываю аудио данные ReadFile(v_hFile,(void*)g_pBuffer,v_sWavHeader.m_dwChunkSize-36,&v_dwReadBytes,NULL); CloseHandle(v_hFile); //Заполняю структуры для хаудио2 g_sDataDesc.wFormatTag=1; g_sDataDesc.nChannels=v_sWavHeader.m_wNumChannels; g_sDataDesc.nSamplesPerSec=v_sWavHeader.m_dwSampleRate; g_sDataDesc.nAvgBytesPerSec=v_sWavHeader.m_dwByteRate; g_sDataDesc.nBlockAlign=v_sWavHeader.m_wBlockAlign; g_sDataDesc.wBitsPerSample=v_sWavHeader.m_wBitsPerSample; g_sDataDesc.cbSize=18; g_sBuffer.Flags=XAUDIO2_END_OF_STREAM; g_sBuffer.AudioBytes=v_sWavHeader.m_dwChunkSize-36; g_sBuffer.pAudioData=g_pBuffer; g_sBuffer.PlayBegin=0; g_sBuffer.PlayLength=0; g_sBuffer.LoopBegin=0; g_sBuffer.LoopLength=0; g_sBuffer.LoopCount=XAUDIO2_LOOP_INFINITE; //Создаю источник g_pAudio->CreateSourceVoice(&g_pSource,&g_sDataDesc); //Передаю информацию в буффер g_pSource->SubmitSourceBuffer(&g_sBuffer); //И о божественная какашка, почему ты проигрываешь белый шум!!!!!! g_pSource->Start(); MessageBox(NULL, "Stop.", "Message", MB_OK); g_pSource->Stop(); g_pSource->DestroyVoice(); g_pMasteringVoice->DestroyVoice(); g_pAudio->Release(); CoUninitialize(); return 0; }
|