XAudio2 - воспроизведение только части аудио

Я пытаюсь воспроизвести mp3/wma с помощью xaudio2. Мне удалось использовать объект Media Foundation Source Reader для декодирования. Моя проблема в том, что он не воспроизводит полный звук; Я смог воспроизвести только часть аудио.

Что я пытаюсь сделать, так это получить следующий образец из IMFSourceReader и отправить его в качестве следующего буфера исходного голоса. Это повторяется до тех пор, пока все данные не будут прочитаны из 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(). Это запустит звук, но не будет воспроизводить полный звук. Нужно ли мне добавить что-то еще?


person milsim    schedule 17.07.2013    source источник


Ответы (1)


Этот цикл не выглядит так, как будто он учитывает, были ли заполнены какие-либо буферы перед отправкой новых, поэтому он может работать на пределе XAUDIO2_MAX_QUEUED_BUFFERS. Можете ли вы создать счетчик в цикле while, чтобы увидеть, сколько буферов отправлено исходному голосу?

Если вы достигли предела, вы можете начать воспроизведение до полного декодирования файла и отправить дополнительные буферы с помощью исходных голосовых обратных вызовов. http://msdn.microsoft.com/en-us/library/windows/desktop/ee415769(v=vs.85).aspx

person Ehz    schedule 17.07.2013
comment
Да, вы были правы... Я не учел XAUDIO2_MAX_QUEUED_BUFFERS, и это вызвало проблему. Спасибо большое - person milsim; 18.07.2013