// ===================================================================
//
// 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;
}
예제 #2
0
//******************************************************************************
// 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;
}
예제 #12
0
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;
}
예제 #18
0
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;
	}

}