在音频数据时,总是在如下函数里出现错误,导致音频流不能输出。
BOOL
HardwareContext::StartOutputDMA()
{
ULONG OutputTransferred;
WAV_MSG((_T("[WAV] StartOutputDMA()\r\n")));
if((m_bOutputDMARunning == FALSE) && (m_Dx == D0))
{
m_bOutputDMARunning = TRUE;
m_nOutByte[OUTPUT_DMA_BUFFER0] = 0;
m_nOutByte[OUTPUT_DMA_BUFFER1] = 0;
m_nOutputBufferInUse = OUTPUT_DMA_BUFFER0; // Start DMA with Buffer 0
m_OutputDMAStatus = (DMA_DONEA | DMA_DONEB) & ~DMA_BIU;
OutputTransferred = TransferOutputBuffer(m_OutputDMAStatus);
if(OutputTransferred)
{
CodecPowerControl(); // Turn Output Channel
CodecMuteControl(DMA_CH_OUT, FALSE); // Unmute Output Channel
// IIS PCM output enable
IIS_set_tx_mode_control(IIS_TRANSFER_NOPAUSE);
// Output DMA Start
DMA_set_channel_source(&g_OutputDMA, m_OutputDMABufferPhyPage[OUTPUT_DMA_BUFFER0], WORD_UNIT, BURST_1, INCREASE);
DMA_set_channel_destination(&g_OutputDMA, IIS_get_output_physical_buffer_address(IIS_CH_2), WORD_UNIT, BURST_1, FIXED);
DMA_set_channel_transfer_size(&g_OutputDMA, AUDIO_DMA_PAGE_SIZE);
DMA_set_initial_LLI(&g_OutputDMA, 1);
DMA_channel_start(&g_OutputDMA);
IIS_set_active_on();
}
else
{
WAV_ERR((_T("[WAV:ERR] StartOutputDMA() : There is no data to transfer\r\n")));
m_bOutputDMARunning = FALSE;
}
}
else
{
//StopOutputDMA(); //20100703 xiehb
//WAV_ERR((_T("[WAV:ERR] StartOutputDMA() : Output DMA is already running or m_Dx[%d] is not D0\r\n"), m_Dx));
WAV_ERR((_T("[WAV:ERR] m_Dx[%d]\r\n"), m_Dx));
return FALSE;
}
return TRUE;
}
这个函数里,发送一次音频数据后,m_bOutputDMARunning = TRUE; 如果没有停止播放,则m_bOutputDMARunning 一直不能=FALSE了,以后的数据都不能发送了。
由于对IIS驱动不熟悉,不知是何原因造成这样的,这个有谁曾经碰到过呢?
另:6410的IIS驱动中,如何设置本机的IIS驱动为从模式,设备为主模式?这个模式设置一直都没有找到在哪里设置.
我希望将它设置为从模式。
6 个解决方案
#1
改过IIS的不过没你那么深入,只是吧把原来的通道2改成通道0,因为我管脚接的是通道0,改完后能正常播放声音就不去管了
#2
问题不在m_bOutputDMARunning 这里,问题是在void HardwareContext::InterruptThread()中,你要实现在I2S 传输时的中断,当BUFA传输完成后需要产生中断在void HardwareContext::InterruptThread()函数中去实现BUFA和bufB数据的后续填写。
#3
友情帮顶。
#4
路过学习中。。。
#5
学习中。。。
#6
你的问题搞定了的吧。结贴啊,gate
#1
改过IIS的不过没你那么深入,只是吧把原来的通道2改成通道0,因为我管脚接的是通道0,改完后能正常播放声音就不去管了
#2
问题不在m_bOutputDMARunning 这里,问题是在void HardwareContext::InterruptThread()中,你要实现在I2S 传输时的中断,当BUFA传输完成后需要产生中断在void HardwareContext::InterruptThread()函数中去实现BUFA和bufB数据的后续填写。
#3
友情帮顶。
#4
路过学习中。。。
#5
学习中。。。
#6
你的问题搞定了的吧。结贴啊,gate