void CsrSubwooferPluginDisconnect(void) { /* Disconnect the appropriate input to Kalimba */ if (plugin_data->input == SUBWOOFER_INPUT_ADC) { PRINT(("[SW_PLUGIN : Disconnect ADC to Kalimba\n")); StreamDisconnect(plugin_data->audio_source, StreamKalimbaSink(DSP_INPUT_PORT_ADC)); } else if (plugin_data->input == SUBWOOFER_INPUT_ESCO) { PRINT(("[SW_PLUGIN] Disconnect eSCO to Kalimba\n")); StreamDisconnect(plugin_data->audio_source, StreamKalimbaSink(DSP_INPUT_PORT_ESCO)); StreamConnectDispose(plugin_data->audio_source); } else if (plugin_data->input == SUBWOOFER_INPUT_L2CAP) { PRINT(("[SW_PLUGIN] Disconnect L2CAP to Kalimba\n")); StreamDisconnect(plugin_data->audio_source, StreamKalimbaSink(DSP_INPUT_PORT_L2CAP)); StreamConnectDispose(plugin_data->audio_source); } /* Disconnect the appropriate output from Kalimba */ if (plugin_data->output == SUBWOOFER_OUTPUT_DAC) { PRINT(("[SW_PLUGIN] Disconnect Kalimba to DAC\n")); StreamDisconnect(StreamKalimbaSource(DSP_OUTPUT_PORT_DAC), plugin_data->codec_sink); } else if (plugin_data->output == SUBWOOFER_OUTPUT_I2S) { PRINT(("[SW_PLUGIN] Disconnect Kalimba to I2S\n")); CsrI2SAudioOutputDisconnect(TRUE); } /* dispose of any remaining messages in the queue */ (void) MessageCancelAll( (TaskData*)&csr_subwoofer_plugin, MESSAGE_FROM_KALIMBA); MessageKalimbaTask( NULL ); /* Everything has been disconnected so power down Kalimba */ KalimbaPowerOff(); /* reset flags */ SetAudioInUse(FALSE); SetCurrentDspStatus(DSP_NOT_LOADED); /* Free the memory allocated to use for the plugin as it's no longer valid */ free(plugin_data); plugin_data = NULL; }
/**************************************************************************** DESCRIPTION Disconnect Sync audio */ void CsrA2dpDecoderPluginDisconnect( void ) { if (!DECODER) Panic() ; /*disconnect the pcm streams*/ StreamDisconnect(StreamPcmSource(0), StreamPcmSink(0)); StreamDisconnect(StreamPcmSource(1), StreamPcmSink(1)); /* For sinks disconnect the source in case its currently being disposed. */ StreamDisconnect(StreamSourceFromSink(DECODER->media_sink ), 0); StreamConnectDispose (StreamSourceFromSink(DECODER->media_sink)) ; KalimbaPowerOff() ; free (DECODER); DECODER = NULL ; }
/**************************************************************************** NAME hidConnDisconnected DESCRIPTION Called to put the specified connection into the disconnected state. RETURNS void */ void hidConnDisconnected(HID *hid, Sink sink) { hidConnection *conn = NULL; /* Find connection structure */ if (((hid->connection[HID_CON_CONTROL].state == hidConConnected) || (hid->connection[HID_CON_CONTROL].state == hidConDisconnecting)) && (sink == hid->connection[HID_CON_CONTROL].con.sink)) conn = &hid->connection[HID_CON_CONTROL]; else if (((hid->connection[HID_CON_INTERRUPT].state == hidConConnected) || (hid->connection[HID_CON_INTERRUPT].state == hidConDisconnecting)) && (sink == hid->connection[HID_CON_INTERRUPT].con.sink)) conn = &hid->connection[HID_CON_INTERRUPT]; else Panic(); /* Dispose of any messages left in the l2cap sources to ensure the buffers are destroyed */ StreamDisconnect(StreamSourceFromSink(sink), 0); StreamConnectDispose(StreamSourceFromSink(sink)); /* Move connection into disconnected state */ conn->state = hidConDisconnected; }
/**************************************************************************** DESCRIPTION This function connects a synchronous audio stream to the pcm subsystem */ void CsrSbcEncoderPluginConnect( Sink audio_sink , Task codec_task , uint16 volume , uint32 rate , bool stereo , AUDIO_MODE_T mode , const void * params ) { /* DSP Application loading and Transform starting is handled by a call to A2dpAudioCodecEnable in the application, so should not be done here. */ typedef struct { unsigned source_type:4; unsigned reserved:4; uint8 content_protection; uint32 voice_rate; unsigned bitpool:8; unsigned format:8; uint16 packet_size; Sink media_sink_b; } sbc_codec_data_type; sbc_codec_data_type *sbc_codecData = (sbc_codec_data_type *) params; if (!sbc_codecData) Panic(); SBC = (SBC_t*)PanicUnlessMalloc (sizeof (SBC_t) ) ; SBC->media_sink[0] = audio_sink ; SBC->codec_task = codec_task ; SBC->media_sink[1] = sbc_codecData->media_sink_b; SBC->packet_size = sbc_codecData->packet_size; StreamDisconnect(StreamKalimbaSource(2), 0); /* Initialise the RTP SBC encoder */ SBC->t[0] = TransformRtpSbcEncode(StreamKalimbaSource(2), audio_sink); /* Configure the RTP transform to generate the selected packet size */ TransformConfigure(SBC->t[0], VM_TRANSFORM_RTP_SBC_ENCODE_PACKET_SIZE, sbc_codecData->packet_size); /* Transform should not manage timings. */ TransformConfigure(SBC->t[0], VM_TRANSFORM_RTP_SBC_ENCODE_MANAGE_TIMING, FALSE); /* Start the transform */ (void) TransformStart(SBC->t[0]); PRINT(("Audio Plugin: TransformStart sink:0x%x\n",(uint16)audio_sink)); if (SBC->media_sink[1]) { /* There is a 2nd audio stream so initialise this transform */ StreamDisconnect(StreamKalimbaSource(3), 0); /* Initialise the RTP SBC encoder */ SBC->t[1] = TransformRtpSbcEncode(StreamKalimbaSource(3), SBC->media_sink[1]); /* Configure the RTP transform to generate the selected packet size */ TransformConfigure(SBC->t[1], VM_TRANSFORM_RTP_SBC_ENCODE_PACKET_SIZE, sbc_codecData->packet_size); /* Transform should not manage timings. */ TransformConfigure(SBC->t[1], VM_TRANSFORM_RTP_SBC_ENCODE_MANAGE_TIMING, FALSE); /* Start the transform */ (void) TransformStart(SBC->t[1]); PRINT(("Audio Plugin: TransformStart sink:0x%x\n",(uint16)SBC->media_sink[1])); } /* Configure SBC encoding format */ if (!KalimbaSendMessage(KALIMBA_MSG_SBCENC_SET_PARAMS, sbc_codecData->format, 0, 0, 0)) /* If message fails to get through, abort */ Panic(); /* Pass bit pool value to DSP */ if (!KalimbaSendMessage(KALIMBA_MSG_SBCENC_SET_BITPOOL, sbc_codecData->bitpool, 0, 0, 0)) /* If message fails to get through, abort */ Panic(); /* disard any data sent by the SNK */ StreamConnectDispose(StreamSourceFromSink(audio_sink)); if (SBC->media_sink[1]) { /* disard any data sent by the 2nd SNK */ StreamConnectDispose(StreamSourceFromSink(SBC->media_sink[1])); } /* select the source type */ if(sbc_codecData->source_type == SourceUsb) { PRINT(("Audio Plugin: SourceUsb\n")); /* Select the source type */ PanicFalse(KalimbaSendMessage(KALIMBA_ENCODER_SELECT, 0x0001, 0, 0, 0)); } else { PRINT(("Audio Plugin: SourceAnalog\n")); /* For analogue input source */ StreamDisconnect(StreamPcmSource(0), StreamPcmSink(0)); StreamDisconnect(StreamPcmSource(1), StreamPcmSink(1)); (void)PcmClearAllRouting(); if (CodecGetCodecType(codec_task) == codec_wm8731) { PRINT(("Audio Plugin: codec_wm8731\n")); /* configure slot 0 and 1 to be left and right channel and synchronise the offsets for stereo playback */ (void)PcmRateAndRoute(0, PCM_NO_SYNC, (uint32) rate, (uint32) rate, VM_PCM_EXTERNAL_I2S); (void)PcmRateAndRoute(1, 0, (uint32) rate, (uint32) rate, VM_PCM_EXTERNAL_I2S); } else { PRINT(("Audio Plugin: codec_internal\n")); /* configure slot 0 and 1 to be left and right channel and synchronise the offsets for stereo playback */ (void)PcmRateAndRoute(0, PCM_NO_SYNC, (uint32) rate, (uint32) rate, VM_PCM_INTERNAL_A); (void)PcmRateAndRoute(1, 0, (uint32) rate, (uint32) rate, VM_PCM_INTERNAL_B); } /* plug Left ADC into port 0 */ (void)StreamConnect(StreamPcmSource(0),StreamKalimbaSink(0)); /* plug Right ADC into port 1 */ (void)StreamConnect(StreamPcmSource(1),StreamKalimbaSink(1)); /* Select the source type */ PanicFalse(KalimbaSendMessage(KALIMBA_ENCODER_SELECT, 0x0002, 0, 0, 0)); if(!KalimbaSendMessage(KALIMBA_MSG_GO,0,0,0,0)) { PRINT(("SBC: Message KALIMBA_MSG_GO failed!\n")); Panic(); } } /* Select the source type */ /*PanicFalse(KalimbaSendMessage(KALIMBA_SOURCE_SELECT, SOURCE_USB, 0, 0, 0)); */ /*CsrSbcEncoderUsbPluginSetVolume(volume) ;*/ /*(void) StreamConnect(PanicNull(StreamUsbEndPointSource(end_point_iso_in)), StreamKalimbaSink(0)); */ /* Start decode */ /* if(!KalimbaSendMessage(KALIMBA_MSG_GO,0,0,0,0)) { PRINT(("SBC: Message KALIMBA_MSG_GO failed!\n")); Panic(); } */ }