У меня есть класс (старый, бесплатный), который прекрасно оборачивает звуковые функции 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 выборок бессмысленны.
Есть идеи?