@@ -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 ));
0 commit comments