首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

wince声道切换!该怎么处理

2012-02-20 
wince声道切换!我使用DX做了一个mp3播放器。使用waveoutsetvolume()设置左右声道的音量,设置成功之后,我连

wince声道切换!
我使用DX做了一个mp3播放器。
使用waveoutsetvolume()设置左右声道的音量,设置成功之后,我连续播放同一个声音,
居然自己跳到另外一个声道去播放了!

就是说我没有做任何动作,他自己把声道切换到另外一边去播放了!

这样一来,我在左声道播放的声音就有可能出现自动跳到右声道播放的可能,很不稳定!

请问有没有什么解决方法,谢谢!

[解决办法]
查找驱动程序中的音频流到DMA传输哪里, 我的驱动是在流上下文 句柄实例 那里面准备要播放的缓冲区,然后调用设备去添加缓冲区,然后再调用流里面的发送到DMA通道, 最后调用硬件设备的DMA中断去处理。

一般你的自动切换左右声道,你要仔细调试你的驱动是否哪里有问题:
1、缓冲区准备是否正确, 缓冲区数据传输是否正确
2、DMA通道传输是否正确
3、DMA结束控制是否正确,也就是你的缓冲区在传输过程中动态的长度处理是怎么样的?
4、语音流结束控制如何,哪里调用了停止,也就是3中的问题 ,


如果这些都搞好了, 你的驱动也许就不会有问题了。

好运
[解决办法]
1、底层驱动:中在你打开设备前,你会调用系统音频设备查询,将返回你是否支持双声道 这点, 我想你肯定支持了
2、PDD中PDD_WaveOpen 中会检查你的声道:
//
// Allow PCM, mono or stereo, 8 or 16 bit at 11k or 22k Hz
//
if ((lpFormat->wFormatTag != WAVE_FORMAT_PCM) ||
(lpFormat->nChannels != 1 && lpFormat->nChannels != 2) ||
(lpFormat->nSamplesPerSec < 4000 || lpFormat->nSamplesPerSec > 48000) ||
(lpFormat->wBitsPerSample != 16 && lpFormat->wBitsPerSample != 8) )
{
mmRet = WAVERR_BADFORMAT;
goto EXIT;
}

这就是说没有播放前,这里要求你的声道数据必须要对,左右声道数据不同, 且分为16位的高8Bit和低8 Bit

3.CreateStream时就根据你打开设备的情况创建了流缓冲区
StreamContext *OutputDeviceContext::CreateStream(LPWAVEOPENDESC lpWOD)
{
LPWAVEFORMATEX lpFormat=lpWOD->lpFormat;
 
if (lpFormat->nChannels==1)
{
if (lpFormat->wBitsPerSample==8)
{
return new OutputStreamContextM8;
}
else
{
return new OutputStreamContextM16;
}
}
else
{
if (lpFormat->wBitsPerSample==8)
{
return new OutputStreamContextS8;
}
else
{
return new OutputStreamContextS16;
}
}
}
[解决办法]
播放中没有问题,下次播放出问题,明显是在两次播放之间有驱动操作,其中肯定涉及了通道切换的配置。
连续播放其实也是两次播放,只不过是自动判断并开始。
查驱动,打trace,看看播放完成后,上层到底发什么IOControl代码下来,调用驱动的什么函数,看看这个函数里面的代码到底做了什么不希望做的事(切换通道)。

热点排行