// =================================================================== // // Function Name: AUDDRV_VoiceCapture_Stop // // Description: Stop data transfer of voice capture driver. // // ==================================================================== Result_t AUDDRV_VoiceCapture_Stop( VOCAPTURE_TYPE_t type, Boolean immediately ) { VOCAPTURE_Drv_t *audDrv = NULL; VOCAPTURE_MSG_t msg; audDrv = GetDriverByType (type); if (audDrv == NULL) return RESULT_ERROR; memset (&msg, 0, sizeof(VOCAPTURE_MSG_t)); msg.msgID = VOCAPTURE_MSG_STOP; OSQUEUE_Post(audDrv->msgQueue, (QMsg_t*)&msg, TICKS_FOREVER); // make sure the task is stopped. OSSEMAPHORE_Obtain (audDrv->stopSema, TICKS_FOREVER); Log_DebugPrintf(LOGID_AUDIO, " : AUDDRV_VoiceCapture_Stop::Stop capture. type = 0x%x, audDrv->type = 0x%x\n", type, audDrv->drvType); return RESULT_OK; }
//****************************************************************************** // Function Name: CP_Audio_ISR_Handler // // Description: This function is called by high level RIP interrupt service routine // to handles Audio status queue //****************************************************************************** void CP_Audio_ISR_Handler(StatQ_t status_msg) { ISRCMD_t status; if(!qAudioMsg && !taskAudioIsr) { IPC_AudioControlSend((char *)&status_msg, sizeof(status_msg)); if(!qAudioMsg) qAudioMsg = OSQUEUE_Create( QUEUESIZE_CP_ISRMSG, sizeof(ISRCMD_t), OSSUSPEND_PRIORITY); if(!taskAudioIsr) taskAudioIsr = OSTASK_Create( CP_Audio_ISR_TaskEntry, TASKNAME_CP_Audio_ISR, TASKPRI_CP_Audio_ISR, STACKSIZE_CP_Audio_ISR ); } else { status.type = TYPE_SEND_IPC_AUDIO_CTRL; status.payload = status_msg; OSQUEUE_Post(qAudioMsg, (QMsg_t *)&status, TICKS_FOREVER); } }
//=========================================================== // // Function Name: AUDDRV_VoiceRender_Resume // // Description: Stop the data transfer in voice render driver. // //================================================================== Result_t AUDDRV_VoiceRender_Stop( VORENDER_TYPE_t type, Boolean immediately ) { VORENDER_Drv_t *audDrv = NULL; VORENDER_MSG_t msg; Log_DebugPrintf(LOGID_AUDIO, " AUDDRV_VoiceRender_Stop::Stop capture. type = 0x%x, immediately = 0x%x\n", type, immediately); audDrv = GetDriverByType (type); if (audDrv == NULL) return RESULT_ERROR; memset (&msg, 0, sizeof(VORENDER_MSG_t)); if (immediately == TRUE) { msg.msgID = VORENDER_MSG_STOP; } else { msg.msgID = VORENDER_MSG_FINISH; } OSQUEUE_Post(audDrv->msgQueue, (QMsg_t*)&msg, TICKS_FOREVER); // make sure the task is stopped. if (immediately == TRUE) { OSSEMAPHORE_Obtain (audDrv->stopSema, TICKS_FOREVER); } return RESULT_OK; }
//=========================================================== // // Function Name: AUDDRV_VoiceRender_Write // // Description: Send audio data to voice render driver. // //================================================================== UInt32 AUDDRV_VoiceRender_Write( VORENDER_TYPE_t type, UInt8* pBuf, UInt32 nSize ) { VORENDER_Drv_t *audDrv = NULL; VORENDER_MSG_t msg; audDrv = GetDriverByType (type); if (audDrv == NULL) return RESULT_ERROR; memset (&msg, 0, sizeof(VORENDER_MSG_t)); msg.msgID = VORENDER_MSG_ADD_BUFFER; msg.parm1 = (UInt32)pBuf; msg.parm2 = nSize; OSQUEUE_Post(audDrv->msgQueue, (QMsg_t*)&msg, TICKS_FOREVER); // wait for the data copy finished. OSSEMAPHORE_Obtain (audDrv->addBufSema, TICKS_FOREVER); Log_DebugPrintf(LOGID_AUDIO, "AUDDRV_VoiceRender_Write :: srcBufCopied = 0x%x\n", audDrv->srcBufCopied); return audDrv->srcBufCopied; }
// ========================================================================= // Function Name: AMRWB_Render_Request // // Description: DSP AMRWB Request new data. The DSP interrupt handler will call it to request // new data. //==================================================================================== void AMRWB_Render_Request(VPStatQ_t reqMsg) { VORENDER_MSG_t msg; VORENDER_Drv_t *audDrv = NULL; // we may still get dsp int after task is gone, ignore these late fellows audDrv = GetDriverByType (VORENDER_TYPE_AMRWB); if ((audDrv == NULL) || (audDrv->isRunning == FALSE)) { Log_DebugPrintf(LOGID_AUDIO, "## [AMRWB][%s] entered wrong state ##\n", __FUNCTION__); return; } memset (&msg, 0, sizeof(VORENDER_MSG_t)); switch (reqMsg.status) { case VP_STATUS_PRAM_CODEC_DONEPLAY: // dsp finishes play, need to stop. OSSEMAPHORE_Release (audDrv->stopDspAmrWbSema); break; case VP_STATUS_PRAM_CODEC_INPUT_EMPTY: case VP_STATUS_PRAM_CODEC_INPUT_LOW: msg.msgID = VORENDER_MSG_SHM_REQUEST; msg.parm1 = reqMsg.arg1; //dsp_read_index msg.parm2 = reqMsg.arg2; //dsp_write_index OSQUEUE_Post(sAMRWB_Drv.msgQueue, (QMsg_t*)&msg, TICKS_FOREVER); break; #if 0 // not supported by DSP since Athena case VP_STATUS_PRAM_CODEC_CANCELPLAY: // dsp cancels play, need to stop immediately. // should go through normal process, set done flag, disble vpu stuff ??? msg.msgID = VORENDER_MSG_STOP; OSQUEUE_Post(sAMRWB_Drv.msgQueue, (QMsg_t*)&msg, TICKS_FOREVER); break; #endif default: Log_DebugPrintf(LOGID_AUDIO, "## [AMRWB][%s] received unknown msg ##\n", __FUNCTION__); break; } }
// ========================================================================= // Function Name: VPU_Render_Request // // Description: DSP VPU Request new data. The DSP interrupt handler will call it to request // new data. //==================================================================================== void VPU_Render_Request(VPStatQ_t reqMsg) { VORENDER_MSG_t msg; Log_DebugPrintf(LOGID_AUDIO, "VPU_Render_Request:: render interrupt callback.\n"); memset (&msg, 0, sizeof(VORENDER_MSG_t)); msg.msgID = VORENDER_MSG_SHM_REQUEST; msg.parm1 = reqMsg.arg0; // buffer index OSQUEUE_Post(sVPU_Drv.msgQueue, (QMsg_t*)&msg, TICKS_FOREVER); }
// =================================================================== // // Function Name: AUDDRVVPU_Capture_Request_VoiceCapture_Stop // // Description: Send a AMRWB capture request for voice capture driver to copy // data from DSP shared memory. // // ==================================================================== void AMRWB_Capture_Request(VPStatQ_t reqMsg) { VOCAPTURE_MSG_t msg; memset (&msg, 0, sizeof(VOCAPTURE_MSG_t)); msg.msgID = VOCAPTURE_MSG_SHM_REQUEST; msg.parm1 = reqMsg.arg2; //index msg.parm2 = reqMsg.arg0; //size OSQUEUE_Post(sAMRWB_Drv.msgQueue, (QMsg_t*)&msg, TICKS_FOREVER); }
// ========================================================================= // Function Name: ARM2SP2_Render_Request // // Description: DSP ARM2SP2 Request new data. The DSP interrupt handler will call it to request // new data. //==================================================================================== void ARM2SP2_Render_Request(VPStatQ_t reqMsg) { VORENDER_MSG_t msg; Log_DebugPrintf(LOGID_AUDIO, "ARM2SP_Render_Request:: render interrupt callback. arg1 = 0x%x\n", reqMsg.arg1); memset (&msg, 0, sizeof(VORENDER_MSG_t)); msg.msgID = VORENDER_MSG_SHM_REQUEST; msg.parm1 = reqMsg.arg1; // buffer position OSQUEUE_Post(sARM2SP_Drv[AUDDRV_ARM2SP_GetInstanceID(VORENDER_TYPE_PCM_ARM2SP2)].msgQueue, (QMsg_t*)&msg, TICKS_FOREVER); }
void SysUsbRpc_PostMsg(const InterTaskMsg_t *msg) { OSStatus_t status; if(!SysUsbRpc_Queue) { Log_DebugPrintf(LOGID_USB, "%s PostMsg without valid Queue init IPC: \n", PROC_TYPE); SysUsbRpc_Init(); } // Log_DebugPrintf(LOGID_USB, "%s PostMsg msg:%p type:%d len:%d buf:%p", PROC_TYPE, msg, msg->msgType, msg->dataLength, msg->dataBuf); status = OSQUEUE_Post(SysUsbRpc_Queue , (QMsg_t *) &msg, TICKS_NO_WAIT); xassert(status == OSSTATUS_SUCCESS, status); return; }
// =================================================================== // // Function Name: AUDDRV_VoiceCapture_Pause // // Description: Pause data transfer of voice capture driver. // // ==================================================================== Result_t AUDDRV_VoiceCapture_Pause ( VOCAPTURE_TYPE_t type ) { VOCAPTURE_Drv_t *audDrv = NULL; VOCAPTURE_MSG_t msg; audDrv = GetDriverByType (type); if (audDrv == NULL) return RESULT_ERROR; memset (&msg, 0, sizeof(VOCAPTURE_MSG_t)); msg.msgID = VOCAPTURE_MSG_PAUSE; OSQUEUE_Post(audDrv->msgQueue, (QMsg_t*)&msg, TICKS_FOREVER); return RESULT_OK; }
//=========================================================== // // Function Name: AUDDRV_VoiceRender_Resume // // Description: Resume the data transfer in voice render driver. // //================================================================== Result_t AUDDRV_VoiceRender_Resume( VORENDER_TYPE_t type ) { VORENDER_Drv_t *audDrv = NULL; VORENDER_MSG_t msg; audDrv = GetDriverByType (type); if (audDrv == NULL) return RESULT_ERROR; memset (&msg, 0, sizeof(VORENDER_MSG_t)); msg.msgID = VORENDER_MSG_RESUME; OSQUEUE_Post(audDrv->msgQueue, (QMsg_t*)&msg, TICKS_FOREVER); return RESULT_OK; }
static RPC_Result_t EEM_DataIndCb(PACKET_InterfaceType_t interfaceType, UInt8 channel, PACKET_BufHandle_t dataBufHandle) { EEM_QueueEntry_t msg; OSStatus_t status; assert(interfaceType == INTERFACE_USB_EEM); msg.id = channel; msg.data = dataBufHandle; Log_DebugPrintf(LOGID_SYSEEMRPC, "EEM_DataIndCb: POST pkt:0x%x ", dataBufHandle); status = OSQUEUE_Post(eem_data_Queue, (QMsg_t *) &msg, TICKS_NO_WAIT); xassert( status == OSSTATUS_SUCCESS, status ); return RPC_RESULT_PENDING; }
// ========================================================================== // // Function Name: AUDDRV_VoiceRender_FlushBuffer // // Description: Flush the voice render driver queue. // // ========================================================================= Result_t AUDDRV_VoiceRender_FlushBuffer(VORENDER_TYPE_t type) { VORENDER_Drv_t *audDrv = NULL; VORENDER_MSG_t msg = {VORENDER_MSG_CONFIG, 0, 0}; audDrv = GetDriverByType (type); if (audDrv == NULL) return RESULT_ERROR; msg.msgID = VORENDER_MSG_FLUSH_BUFFER; OSQUEUE_Post(audDrv->msgQueue, (QMsg_t*)&msg, TICKS_FOREVER); Log_DebugPrintf(LOGID_AUDIO, "AUDDRV_VoiceRender_FlushBuffer \n"); return RESULT_OK; }
// =================================================================== // // Function Name: AUDDRV_VoiceCapture_SetBufDoneCB // // Description: register buffer done callback // when driver finishes coping the data from the buffer to driver queue // driver calls this callback to notify. // // ==================================================================== Result_t AUDDRV_VoiceCapture_SetBufDoneCB ( VOCAPTURE_TYPE_t type, AUDDRV_VoiceCapture_BufDoneCB_t bufDone_cb ) { VOCAPTURE_Drv_t *audDrv = NULL; VOCAPTURE_MSG_t msg; audDrv = GetDriverByType (type); if (audDrv == NULL) return RESULT_ERROR; memset (&msg, 0, sizeof(VOCAPTURE_MSG_t)); msg.msgID = VOCAPTURE_MSG_REGISTER_BUFDONE_CB; msg.parm1 = (UInt32)bufDone_cb; OSQUEUE_Post(audDrv->msgQueue, (QMsg_t*)&msg, TICKS_FOREVER); return RESULT_OK; }
// =================================================================== // // Function Name: AUDDRV_VoiceCapture_SetConfig // // Description: Configuree voice capture dirver, // Set parameters before start capture. // // ==================================================================== Result_t AUDDRV_VoiceCapture_SetConfig( VOCAPTURE_TYPE_t type, UInt32 speech_mode, UInt8 amr_data_rate, VOCAPTURE_RECORD_MODE_t record_mode, AUDIO_SAMPLING_RATE_t sample_rate, Boolean audio_proc_enable, Boolean vp_dtx_enable) { VOCAPTURE_Drv_t *audDrv = NULL; VOCAPTURE_Configure_t *config; VOCAPTURE_MSG_t msg; audDrv = GetDriverByType (type); if (audDrv == NULL) return RESULT_ERROR; config = (VOCAPTURE_Configure_t *)OSHEAP_Alloc(sizeof(VOCAPTURE_Configure_t)); config->speechMode = speech_mode; config->dataRate = amr_data_rate; config->recordMode = record_mode; config->samplingRate = sample_rate; config->procEnable = audio_proc_enable; config->dtxEnable = vp_dtx_enable; memset (&msg, 0, sizeof(VOCAPTURE_MSG_t)); msg.msgID = VOCAPTURE_MSG_CONFIG; msg.parm1 = (UInt32)config; OSQUEUE_Post(audDrv->msgQueue, (QMsg_t*)&msg, TICKS_FOREVER); return RESULT_OK; }
//********************************************************************* // // Function Name: AUDDRV_VoiceRender_SetTransferParameters // // Description:Set the driver transfer parameters before configure driver, if needed. // // @param type The voice render driver type // @param callbackThreshold(in ms) Driver will callback when buffer size is lower than the threshold // @param interruptInterval(in ms) The DSP intterrupt interval // @return Result_t // @note Driver will use default values if this function is not called //************************************************************************** Result_t AUDDRV_VoiceRender_SetTransferParameters( VORENDER_TYPE_t type, UInt32 callbackThreshold, UInt32 interruptInterval) { VORENDER_Drv_t *audDrv = NULL; VORENDER_MSG_t msg = {VORENDER_MSG_SET_TRANSFER, 0, 0}; audDrv = GetDriverByType (type); if (audDrv == NULL) return RESULT_ERROR; Log_DebugPrintf(LOGID_SOC_AUDIO, "AUDDRV_VoiceRender_SetTransferParameters:: type = 0x%x, callbackThreshold = 0x%x, interruptInterval = 0x%x\n", audDrv->drvType, callbackThreshold, interruptInterval); msg.msgID = VORENDER_MSG_SET_TRANSFER; msg.parm1 = (UInt32)callbackThreshold; msg.parm2 = (UInt32)interruptInterval; OSQUEUE_Post(audDrv->msgQueue, (QMsg_t*)&msg, TICKS_FOREVER); return RESULT_OK; }
//=========================================================== // // Function Name: AUDDRV_VoiceRender_SetConfig // // Description: Configure voice render driver, Set parameters before start render. // //================================================================== Result_t AUDDRV_VoiceRender_SetConfig( VORENDER_TYPE_t type, VORENDER_PLAYBACK_MODE_t playbackMode, VORENDER_VOICE_MIX_MODE_t mixMode, AUDIO_SAMPLING_RATE_t samplingRate, UInt32 speechMode, // used by AMRNB and AMRWB UInt32 dataRateSelection // used by AMRNB and AMRWB ) { VORENDER_Drv_t *audDrv = NULL; VORENDER_Configure_t *config; VORENDER_MSG_t msg; audDrv = GetDriverByType (type); if (audDrv == NULL) return RESULT_ERROR; config = (VORENDER_Configure_t *)OSHEAP_Alloc(sizeof(VORENDER_Configure_t)); config->playbackMode = playbackMode; config->mixMode = mixMode; config->samplingRate = samplingRate; config->speechMode = speechMode; config->dataRateSelection = dataRateSelection; memset (&msg, 0, sizeof(VORENDER_MSG_t)); msg.msgID = VORENDER_MSG_CONFIG; msg.parm1 = (UInt32)config; OSQUEUE_Post(audDrv->msgQueue, (QMsg_t*)&msg, TICKS_FOREVER); return RESULT_OK; }
void AP_Audio_ISR_Handler(StatQ_t status_msg) { int isr_status = status_msg.status; #ifdef INTERRUPT_STATUS_ON _DBG_(Log_DebugPrintf(LOGID_AUDIO, "DSP Interrupt status_msg.status : 0x%x 0x%x 0x%x 0x%x ",status_msg.status, status_msg.arg0, status_msg.arg1, status_msg.arg2)); if(isr_status == STATUS_NEWAUDFIFO_SW_FIFO_LOW) _DBG_(Log_DebugPrintf(LOGID_AUDIO, "STATUS_NEWAUDFIFO_SW_FIFO_LOW\r\n")); else if (isr_status == STATUS_NEWAUDFIFO_SW_FIFO_EMPTY) _DBG_(Log_DebugPrintf(LOGID_AUDIO, "STATUS_NEWAUDFIFO_SW_FIFO_EMPTY\r\n")); else if (isr_status == STATUS_NEWAUDFIFO_DONEPLAY) _DBG_(Log_DebugPrintf(LOGID_AUDIO, "STATUS_NEWAUDFIFO_DONEPLAY\r\n")); else if (isr_status == STATUS_NEWAUDFIFO_CANCELPLAY) _DBG_(Log_DebugPrintf(LOGID_AUDIO, "STATUS_NEWAUDFIFO_CANCELPLAY\r\n")); #if 0 // the following status is moved to AP status queue (VPU) else if (isr_status == STATUS_PRAM_CODEC_INPUT_EMPTY) _DBG_(Log_DebugPrintf(LOGID_AUDIO, "STATUS_PRAM_CODEC_INPUT_EMPTY\r\n")); else if (isr_status == STATUS_PRAM_CODEC_INPUT_LOW) _DBG_(Log_DebugPrintf(LOGID_AUDIO, "STATUS_PRAM_CODEC_INPUT_LOW\r\n")); else if (isr_status == STATUS_PRAM_CODEC_OUTPUT_FULL) _DBG_(Log_DebugPrintf(LOGID_AUDIO, "STATUS_PRAM_CODEC_OUTPUT_FULL\r\n")); else if (isr_status == STATUS_PRAM_CODEC_OUTPUT_LOW) _DBG_(Log_DebugPrintf(LOGID_AUDIO, "STATUS_PRAM_CODEC_OUTPUT_LOW\r\n")); else if (isr_status == STATUS_PRAM_CODEC_DONEPLAY) _DBG_(Log_DebugPrintf(LOGID_AUDIO, "STATUS_PRAM_CODEC_DONEPLAY\r\n")); // else if (isr_status == STATUS_PRAM_CODEC_CANCELPLAY) _DBG_(Log_DebugPrintf(LOGID_AUDIO, "STATUS_PRAM_CODEC_CANCELPLAY\r\n")); else if (isr_status == STATUS_USB_HEADSET_BUFFER) _DBG_(Log_DebugPrintf(LOGID_AUDIO, "STATUS_USB_HEADSET_BUFFER\r\n")); #if (defined(_ATHENA_)) else if (isr_status == STATUS_BT_NB_BUFFER_DONE) _DBG_(Log_DebugPrintf(LOGID_AUDIO, "STATUS_BT_NB_BUFFER_DONE\r\n")); #endif #endif // move to AP else if (isr_status == STATUS_ASK_START_DDMA) _DBG_(Log_DebugPrintf(LOGID_AUDIO, "STATUS_ASK_START_DDMA\r\n")); else if (isr_status == VPU_STATUS_RECORDING_DATA_READY) _DBG_(Log_DebugPrintf(LOGID_AUDIO, "VPU_STATUS_RECORDING_DATA_READY\r\n")); else ; //if (isr_status == STATUS_SP) _DBG_(Log_DebugPrintf(LOGID_AUDIO, "STATUS_SP\r\n")); #endif //#ifdef INTERRUPT_STATUS_ON switch (isr_status) { case STATUS_NEWAUDFIFO_SW_FIFO_LOW: { break; } case STATUS_NEWAUDFIFO_SW_FIFO_EMPTY: { break; } case STATUS_TEST_PDMA: { break; } #ifdef VPU_INCLUDED case VPU_STATUS_RECORDING_DATA_READY: { break; } #endif #ifdef AUDIO_DRIVER_HQ_ENABLED case STATUS_HQ_ADC_PAGE_DONE: { block_info.buffer = NULL; block_info.length = status_msg.arg0; // use length to tell which page is used. 0 = page35, 1 = page36. msg.block_info = block_info; msg.type = HQ_RECORDING_PAGE_DONE; if ((p_Device_Channel_HQ_Input) && (p_Device_Channel_HQ_Input->queuAudioMsg)) { OSQUEUE_Post(p_Device_Channel_HQ_Input->queuAudioMsg, (QMsg_t*)&msg, TICKS_FOREVER); } break; } #endif // #ifdef AUDIO_DRIVER_HQ_ENABLED #if (defined(FUSE_DUAL_PROCESSOR_ARCHITECTURE) && defined(FUSE_APPS_PROCESSOR)) case STATUS_AUDIO_STREAM_DATA_READY: { //AUDLOG_ProcessLogChannel((StatQ_t*)&status_msg); break; } #endif default: _DBG_(Log_DebugPrintf(LOGID_AUDIO, "Unknown Interrupt!\r\n")); break; } }