我有一个类(旧的免费软件),它很好地包装了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,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,IID_IAudioData,FAudioData) );
SCheck( FAudioData.setformat(FFormat) );
// creates IAudioStreamSample instance
SCheck( FAudioMediaStream.CreateSample(FAudioData,FAudioStreamSample) );
SCheck( FAMMultiMediaStream.GetDuration(FDuration) );
SCheck( FAMMultiMediaStream.SetState( STREAMSTATE_RUN ) );
初始化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,nil));
FStereo:=wfx.nChannels=2;
FBitsPerSample:=TacahBitsPerSample(wfx.wBitsPerSample shr 4);
FSamplesPerSec:=wfx.nSamplesPerSec;
谁能给我一个从哪里开始寻找问题的线索?切换到DirectX 9或10/11有多困难?
更新: 我发现了一个新的难题,也许有人可以帮忙吗? fileloader方法报告44khz MP3的以下比特率:
每秒采样数:11025,每个采样位数:16
虽然16位有意义,但11025个采样是无意义的。
有什么想法吗?