DirectSound (8) MP3 плохого качества - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть класс (старый, бесплатный), который прекрасно оборачивает звуковые функции DirectX и позволяет мне контролировать громкость и стереозвук звука. Но звуки (из файлов MP3) звучат «вымыты», сжаты, плохого качества, и я понятия не имею, почему. Сами файлы звучат хорошо при воспроизведении в любом плеере. Из того, что я могу прочитать в коде, он использует DirectX8, создает 16-битный стереофонический первичный буфер и загружает файл.

некоторые фрагменты кода ...

Загрузка файла

// creates IAMMultiMediaStream instance
  SCheck( CoCreateInstance( CLSID_AMMultiMediaStream, nil, CLSCTX_INPROC_SERVER,
    IID_IAMMultiMediaStream, FAMMultiMediaStream ) );

  SCheck( FAMMultiMediaStream.Initialize(STREAMTYPE_READ, AMMSF_NOGRAPHTHREAD, nil) );

  // creates IMediaStream instance
  SCheck( FAMMultiMediaStream.AddMediaStream(nil, @MSPID_PrimaryAudio, 0, FMediaStream) );

  SCheck( FAMMultiMediaStream.GetMediaStream(MSPID_PrimaryAudio, FMediaStream) );

  // opens the file
  v := FileName;
  SCheck( FAMMultiMediaStream.OpenFile(PWideChar(v), 0) );

  // Get IMediaControl instance
  SCheck( FAMMultiMediaStream.GetFilterGraph(FGraphBuilder) );
  SCheck( FGraphBuilder.QueryInterface(IID_IMediaControl, FMediaControl) );
  SCheck( FGraphBuilder.QueryInterface(IID_IMediaSeeking, FMediaSeeking) );

  // creates IAudioMediaStream instance
  SCheck( FMediaStream.QueryInterface(IID_IAudioMediaStream, FAudioMediaStream) );

  SCheck( FAudioMediaStream.GetFormat(FFormat) );

  // creates IAudioData instance
  SCheck( CoCreateInstance(CLSID_AMAudioData, nil, CLSCTX_INPROC_SERVER,
    IID_IAudioData, FAudioData) );

  SCheck( FAudioData.SetFormat(FFormat) );

  // creates IAudioStreamSample instance
  SCheck( FAudioMediaStream.CreateSample(FAudioData, 0, FAudioStreamSample) );

  SCheck( FAMMultiMediaStream.GetDuration(FDuration) );

  SCheck( FAMMultiMediaStream.SetState( STREAMSTATE_RUN ) );

Init DirectSound

   DSCheck(FPrimaryBuffer.GetFormat(@wfx,sizeof(wfx),nil));
    if FStereo then
      wfx.nChannels:=2
    else
      wfx.nChannels:=1;
    wfx.wBitsPerSample:=(8 shl Ord(FBitsPerSample));
    wfx.nSamplesPerSec:=FSamplesPerSec;
    wfx.nBlockAlign:=(wfx.wBitsPerSample*wfx.nChannels)shr 3;
    wfx.nAvgBytesPerSec:=wfx.nSamplesPerSec*wfx.nBlockAlign;
    DSCheck(FPrimaryBuffer.SetFormat(@wfx));

    // get real format
    DSCheck(FPrimaryBuffer.GetFormat(@wfx,sizeof(wfx),nil));
    FStereo:=wfx.nChannels=2;
    FBitsPerSample:=TacahBitsPerSample(wfx.wBitsPerSample shr 4);
    FSamplesPerSec:=wfx.nSamplesPerSec;

Кто-нибудь может подсказать, с чего начать поиск проблемы? Насколько сложно было бы перейти на DirectX 9 или 10/11?

ОБНОВЛЕНИЕ: Я нашел новую часть головоломки, может кто-нибудь может помочь? Метод fileloader сообщает следующие битрейты для MP3 44 кГц:

Выборок в секунду: 11025, Бит на выборку: 16

В то время как 16 бит имеет смысл, 11025 выборок бессмысленны.

Есть идеи?

...