阅读:2470回复:18
s3c2440/WINCE4.2的系统,当系统正在发声时,挂起系统再唤醒有时没有声音,这是怎么回事?
大家好,我现在系统需要做睡眠唤醒功能,可是奇怪的是,当系统正在发声时,挂起,再唤醒有时会没有声音。比如播放视频文件的时候,唤醒之后有时有声音,视频文件正常播放,有时就没声音了,之后点击触摸屏,没声音,再点击一次,有声音,此时调试串口会出现一个堆栈溢出的错误。检查发现发现是正常唤醒的时候会重新调用wav_iocontrol函数写音频数据,再启动DMA传输,可是没正常唤醒的时候就没有调用wav_iocontrol函数,所以也就没有声音。
不知道有没有人遇到这样的问题,检查了两天,我的音频的硬件传输层应该是没有问题,因为出错的时候根本都还没有启动硬件传输,没有找到问题。 |
|
|
沙发#
发布于:2007-06-07 17:59
你看看是不是唤醒后没有打开OUTPUT DMA,我以前碰倒过这种情况,
|
|
板凳#
发布于:2007-06-07 19:15
楼主能否简单说下睡眠唤醒功能怎么实现的
|
|
地板#
发布于:2007-06-07 20:08
wince_lover兄好!!
我曾经尝试过在audio的powerup函数里边加上一个CeSetPowerEevent()函数去触发一个线程去执行StartupOutputDMA(),StartupOutputDMA()函数里边有一个transferdata()负责具体发送音频数据,可是此时会出现Data abort 的线程错误,不成功,你有没有QQ我向你请教一下。 hzwwin 兄: 一般sansung的BSP的kernel里边会有一个power文件实现睡眠唤醒的具体的事情,你应该只需要调用一个函数就可以了。 |
|
|
地下室#
发布于:2007-06-08 10:45
那音频设备(芯片)是否掉过电?是否需要重新初始化?是否从睡眠状态返回到工作状态了?可以加几个调试信息,看看能不能读写该芯片。
|
|
|
5楼#
发布于:2007-08-02 16:40
你看看是不是唤醒后没有打开OUTPUT DMA,我以前碰倒过这种情况,
请教一下怎样打开OUTPUT DMA????????????? |
|
|
6楼#
发布于:2007-08-03 09:26
调用StartOutputDMA();这个函数
|
|
7楼#
发布于:2007-08-03 14:07
楼上的兄弟,我在power up中调用StartOutputDMA(); power on后TCPMP播放就会死机.
|
|
|
8楼#
发布于:2007-08-03 16:00
power down之前TCPMP播放器处于PAUSE或STOP状态,power on后play就OK!
|
|
|
9楼#
发布于:2007-08-04 09:12
wince_lover兄,
要怎样调用StartOutputDMA()? |
|
|
10楼#
发布于:2007-08-04 09:40
我是在POWERDOWN的时候检测是否正在播放,如果是,用一个变量标记。
在POWERUP时将检查这个标记是否置1,如果是1,调SetInterruptEvent唤醒线程。在线程中StartOutputDMA,清该标记 |
|
11楼#
发布于:2007-08-06 17:37
wince_lover兄,
我用自己定义的#define SYSINTR_MYINTR (SYSINTR_FIRMWARE+22) 来做,线程初始化是OK,进入了等待.在POWER DOWN时设了标志,按POWER键后一点反映都没有(不能POWER ON),我现在还没有检测是否播放.你有没有qq,我的QQ是:404721676,能否加QQ请教你一下.非常谢谢你的指点. |
|
|
12楼#
发布于:2007-08-07 14:45
你应该检查一下,是系统根本没有唤醒,还是唤醒了,在执行某一个驱动的POWERUP函数死掉了?
|
|
13楼#
发布于:2007-08-07 15:29
bSuccess = InterruptInitialize(SYSINTR_MYINTR, m_hAudioInterrupt_My, NULL, 0);
if (!bSuccess) { dwErr = GetLastError(); RETAILMSG(1,(TEXT("My audio interrupt init fail!: %u\r\n"), dwErr)); return FALSE; } m_hAudioInterruptThread_My = CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)CallInterruptThread_My, NULL, 0, NULL); 原来是中断初始化没有成功,刚开始没有加 if (!bSuccess),所以线程创建OK,加了返回之后,在 if (!bSuccess) { dwErr = GetLastError(); RETAILMSG(1,(TEXT("My audio interrupt init fail!: %u\r\n"), dwErr)); return FALSE; } 返回了.我不知道为什么会这样? |
|
|
14楼#
发布于:2007-08-07 18:07
void CallInterruptThread_My(HardwareContext *pHWContext)
{ while(1) { RETAILMSG(1,(TEXT("My thread\n"))); WaitForSingleObject(m_hAudioInterrupt_My, INFINITE); pHWContext->StartOutputDMA(); } } BOOL InitInterruptThread_My() { m_hAudioInterrupt_My = CreateEvent( NULL, FALSE, FALSE, NULL); if (!m_hAudioInterrupt_My) { return FALSE; } m_hAudioInterruptThread_My = CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)CallInterruptThread_My, NULL, 0, NULL); return TRUE; } void HardwareContext::PowerUp() { I2S_Init(); AudioMute((DMA_CH_OUT | DMA_CH_MIC), FALSE); // 030711 CeSetPowerOnEvent(m_hAudioInterrupt_My); } 这样也没有声音,这是为什么? |
|
|
15楼#
发布于:2007-08-07 21:08
你把#define SYSINTR_MYINTR (SYSINTR_FIRMWARE+22)
把22改小点 |
|
16楼#
发布于:2007-08-09 18:15
wince_lover兄,
现在power on后有声音了,不过刚power on后声音会顿两下,感觉就象系统忙 |
|
|
17楼#
发布于:2007-08-10 14:16
那你稍微延时一下再打开试试
|
|
18楼#
发布于:2007-08-13 10:46
谢谢 wince_lover
|
|
|