Я пытаюсь воспроизвести mp3 / wma с помощью xaudio2. Мне удалось использовать объект Media Foundation Source Reader для декодирования. Моя проблема в том, что он не воспроизводит полный звук; Я мог получить только часть проигрываемого звука.
Я пытаюсь получить следующий образец из IMFSourceReader и отправить его в качестве следующего буфера sourcevoice. Это повторяется, когда все данные считываются из IMFSourceReader.
while (true)
{
DWORD dwFlags = 0;
// Read the next sample.
hr = pReader->ReadSample(
(DWORD)MF_SOURCE_READER_FIRST_AUDIO_STREAM,
0, NULL, &dwFlags, NULL, &pSample );if (dwFlags & MF_SOURCE_READERF_CURRENTMEDIATYPECHANGED)
{
printf("Type change - not supported by WAVE file format.\n");
break;
}
if (dwFlags & MF_SOURCE_READERF_ENDOFSTREAM)
{
printf("End of input file.\n");
break;
}
if (pSample == NULL)
{
printf("No sample\n");
continue;
}
// Get a pointer to the audio data in the sample.
hr = pSample->ConvertToContiguousBuffer(&pBuffer);
if (FAILED(hr)) { break; }hr = pBuffer->Lock(&pAudioData, NULL, &cbBuffer);
if (FAILED(hr)) { break; }// Make sure not to exceed the specified maximum size.
if (cbMaxAudioData - cbAudioData < cbBuffer)
{
cbBuffer = cbMaxAudioData - cbAudioData;
}
// Write this data to the output file.
hr = WriteToFile(hFile, pAudioData, cbBuffer);
int audioBufferLength = cbBuffer;if (FAILED(hr)) { break; }
SubmitBuffer(pAudioData, audioBufferLength);
// Unlock the buffer.
hr = pBuffer->Unlock();pAudioData = NULL;
if (FAILED(hr)) { break; }
// Update running total of audio data.
cbAudioData += cbBuffer;
if (cbAudioData >= cbMaxAudioData)
{
break;
}
SafeRelease(&pSample);
SafeRelease(&pBuffer);
}
void AudioDecoder::SubmitBuffer(byte *pAudioData, int audioBufferLength)
{
byte * pAudioBuffer = new byte[audioBufferLength];
CopyMemory(pAudioBuffer, pAudioData, audioBufferLength);
if (pAudioBuffer != nullptr)
{
// Create an XAUDIO2_BUFFER for submitting audio data
XAUDIO2_BUFFER buffer = {0};
buffer.AudioBytes = audioBufferLength;
buffer.pAudioData = pAudioBuffer;
buffer.pContext = pAudioBuffer;
HRESULT hresult = m_pSourceVoice->SubmitSourceBuffer(&buffer);
}
}
После этого я звоню m_pSourceVoice-> Start (). Это запустит аудио, но не воспроизводит полный звук. Нужно ли добавить что-нибудь еще?
Этот цикл не выглядит так, как будто он учитывает, были ли завершены какие-либо буферы перед отправкой большего, поэтому он может работать в пределе XAUDIO2_MAX_QUEUED_BUFFERS. Можете ли вы создать счетчик в цикле while, чтобы увидеть, сколько буферов отправлено на исходный голос?
Если вы достигли предела, вы можете начать воспроизведение до полного декодирования файла и отправить дополнительные буферы через голосовые обратные вызовы источника.
http://msdn.microsoft.com/en-us/library/windows/desktop/ee415769(v=vs.85).aspx
Других решений пока нет …