@@ -379,6 +379,9 @@ static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
379379
380380 struct stream_out_common * out = (struct stream_out_common * )stream ;
381381 struct audio_device * adev = out -> dev ;
382+ static uint32_t cardold , devold ;
383+ static bool saved = false;
384+ uint32_t cardnum , devnum ;
382385 uint32_t v ;
383386 int ret ;
384387
@@ -388,6 +391,23 @@ static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
388391
389392 if (ret >= 0 ) {
390393 apply_route (out -> hw , v );
394+ if (get_device_alsadev (adev -> cm , v , & cardnum , & devnum ) < 0 ) {
395+ if (saved ) {
396+ ALOGI ("restoring params with card=%u dev=%u" , cardold , devold );
397+ out -> hw -> card_number = cardold ;
398+ out -> hw -> device_number = devold ;
399+ }
400+ } else {
401+ ALOGI ("updating params with card=%u dev=%u" , cardnum , devnum );
402+ if (!saved ) {
403+ cardold = out -> hw -> card_number ;
404+ devold = out -> hw -> device_number ;
405+ ALOGI ("saved params with card=%u dev=%u" , cardold , devold );
406+ saved = true;
407+ }
408+ out -> hw -> card_number = cardnum ;
409+ out -> hw -> device_number = devnum ;
410+ }
391411 }
392412
393413 stream_invoke_usecases (out -> hw , kvpairs );
@@ -735,6 +755,8 @@ static void out_pcm_fill_params(struct stream_out_pcm *out,
735755/* Must be called with hw device and output stream mutexes locked */
736756static int start_output_pcm (struct stream_out_pcm * out )
737757{
758+ struct config_mgr * cm = out -> common .dev -> cm ;
759+ uint32_t device , cardnum , devnum ;
738760 int ret ;
739761
740762 struct pcm_config config = {
@@ -750,10 +772,21 @@ static int start_output_pcm(struct stream_out_pcm *out)
750772
751773 ALOGV ("+start_output_stream(%p)" , out );
752774
753- out -> pcm = pcm_open (out -> common .hw -> card_number ,
754- out -> common .hw -> device_number ,
755- PCM_OUT | PCM_MONOTONIC ,
756- & config );
775+ device = get_current_routes (out -> common .hw );
776+ ret = get_device_alsadev (cm , device , & cardnum , & devnum );
777+ if (ret < 0 ) {
778+ ALOGI ("device = %u (not alsadev, ret=%d)" , device , ret );
779+ out -> pcm = pcm_open (out -> common .hw -> card_number ,
780+ out -> common .hw -> device_number ,
781+ PCM_OUT | PCM_MONOTONIC ,
782+ & config );
783+ } else {
784+ ALOGI ("device = %u (alsadev)" , device );
785+ out -> pcm = pcm_open (cardnum ,
786+ devnum ,
787+ PCM_OUT | PCM_MONOTONIC ,
788+ & config );
789+ }
757790
758791 if (out -> pcm && !pcm_is_ready (out -> pcm )) {
759792 ALOGE ("pcm_open(out) failed: %s" , pcm_get_error (out -> pcm ));
@@ -1799,6 +1832,8 @@ static void in_pcm_fill_params(struct stream_in_pcm *in,
17991832/* Must be called with hw device and input stream mutexes locked */
18001833static int do_open_pcm_input (struct stream_in_pcm * in )
18011834{
1835+ struct config_mgr * cm = in -> common .dev -> cm ;
1836+ uint32_t device , cardnum , devnum ;
18021837 struct pcm_config config ;
18031838 int ret ;
18041839
@@ -1818,10 +1853,21 @@ static int do_open_pcm_input(struct stream_in_pcm *in)
18181853 config .format = pcm_format_from_android_format (in -> common .format ),
18191854 config .start_threshold = 0 ;
18201855
1821- in -> pcm = pcm_open (in -> common .hw -> card_number ,
1822- in -> common .hw -> device_number ,
1823- PCM_IN | PCM_MONOTONIC ,
1824- & config );
1856+ device = get_current_routes (in -> common .hw );
1857+ ret = get_device_alsadev (cm , device , & cardnum , & devnum );
1858+ if (ret < 0 ) {
1859+ ALOGV ("device = %u (not alsadev, ret=%d)" , device , ret );
1860+ in -> pcm = pcm_open (in -> common .hw -> card_number ,
1861+ in -> common .hw -> device_number ,
1862+ PCM_IN | PCM_MONOTONIC ,
1863+ & config );
1864+ } else {
1865+ ALOGV ("device = %u (alsadev)" , device );
1866+ in -> pcm = pcm_open (cardnum ,
1867+ devnum ,
1868+ PCM_IN | PCM_MONOTONIC ,
1869+ & config );
1870+ }
18251871
18261872 if (!in -> pcm || !pcm_is_ready (in -> pcm )) {
18271873 ALOGE_IF (in -> pcm ,"pcm_open(in) failed: %s" , pcm_get_error (in -> pcm ));
@@ -2047,12 +2093,16 @@ static ssize_t in_pcm_read(struct audio_stream_in *stream, void *buffer,
20472093static int in_pcm_set_parameters (struct audio_stream * stream , const char * kvpairs )
20482094{
20492095 struct stream_in_pcm * in = (struct stream_in_pcm * )stream ;
2096+ struct config_mgr * cm = in -> common .dev -> cm ;
20502097 struct str_parms * parms ;
20512098 char value [32 ];
20522099 uint32_t new_routing = 0 ;
20532100 bool routing_changed ;
20542101 uint32_t devices ;
20552102 bool input_was_changed ;
2103+ static uint32_t cardold , devold ;
2104+ static bool saved = false;
2105+ uint32_t cardnum , devnum ;
20562106 int ret ;
20572107
20582108 ALOGV ("+in_pcm_set_parameters(%p) '%s'" , stream , kvpairs );
@@ -2091,6 +2141,23 @@ static int in_pcm_set_parameters(struct audio_stream *stream, const char *kvpair
20912141 if (in -> common .hw ) {
20922142 ALOGV ("Apply routing=0x%x to input stream" , new_routing );
20932143 apply_route (in -> common .hw , new_routing );
2144+ if (get_device_alsadev (cm , new_routing , & cardnum , & devnum ) < 0 ) {
2145+ if (saved ) {
2146+ ALOGV ("restoring params with card=%u dev=%u" , cardold , devold );
2147+ in -> common .hw -> card_number = cardold ;
2148+ in -> common .hw -> device_number = devold ;
2149+ }
2150+ } else {
2151+ ALOGV ("updating params with card=%u dev=%u" , cardnum , devnum );
2152+ if (!saved ) {
2153+ cardold = in -> common .hw -> card_number ;
2154+ devold = in -> common .hw -> device_number ;
2155+ ALOGV ("saved params with card=%u dev=%u" , cardold , devold );
2156+ saved = true;
2157+ }
2158+ in -> common .hw -> card_number = cardnum ;
2159+ in -> common .hw -> device_number = devnum ;
2160+ }
20942161 }
20952162 }
20962163
0 commit comments