From 200cc8c3e4adfc02ef4163e0101ebd05f930daec Mon Sep 17 00:00:00 2001 From: bruceperens Date: Wed, 19 Mar 2014 23:02:50 +0000 Subject: [PATCH] Make open-by-longname work. git-svn-id: https://svn.code.sf.net/p/freetel/code@1456 01035d8c-6547-0410-b346-abe4f91aad63 --- freedv-server/source/platform/linux/alsa.cpp | 47 +++++++++++++++---- .../source/platform/linux/audio_in_alsa.cpp | 5 +- .../source/platform/linux/audio_out_alsa.cpp | 5 +- 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/freedv-server/source/platform/linux/alsa.cpp b/freedv-server/source/platform/linux/alsa.cpp index 85184566..dc910654 100644 --- a/freedv-server/source/platform/linux/alsa.cpp +++ b/freedv-server/source/platform/linux/alsa.cpp @@ -81,6 +81,34 @@ namespace FreeDV { return stream; } + static int + open_by_longname( + snd_pcm_t * * handle, + const char * name, + snd_pcm_stream_t stream) + { + const int length = strlen(name); + int card_index = -1; + + // Let the normal open handle "default". + if ( strcmp(name, "default") == 0 ) + return -ENODEV; + + while ( snd_card_next(&card_index) == 0 && card_index >= 0 ) { + char device_name[20]; + char * longname = 0; + + if ( snd_card_get_longname(card_index, &longname) == 0 ) { + if ( strncmp(name, longname, length) == 0 ) { + sprintf(device_name, "hw:%d", card_index); + return snd_pcm_open(handle, device_name, stream, 0); + } + } + } + + return -ENODEV; + } + static void do_throw( const int error, @@ -120,14 +148,17 @@ namespace FreeDV { snd_pcm_t * handle = 0; snd_pcm_hw_params_t * hw_params = 0; - error = snd_pcm_open( - &handle, - name, - stream, - mode); - - if ( error < 0 ) - return 0; + error = open_by_longname(&handle, name, stream); + if ( error < 0 ) { + error = snd_pcm_open( + &handle, + name, + stream, + 0); + + if ( error < 0 ) + return 0; + } if ( (error = snd_pcm_hw_params_malloc(&hw_params)) < 0 ) { snd_pcm_close(handle); diff --git a/freedv-server/source/platform/linux/audio_in_alsa.cpp b/freedv-server/source/platform/linux/audio_in_alsa.cpp index cb8f5c7e..ab43998b 100644 --- a/freedv-server/source/platform/linux/audio_in_alsa.cpp +++ b/freedv-server/source/platform/linux/audio_in_alsa.cpp @@ -25,7 +25,7 @@ namespace FreeDV { { std::ostringstream str; - str << "Error on ALSA audio input " << parameters << ": "; + str << "Error on ALSA audio input \"" << parameters << "\": "; if ( message ) str << message << ": "; str << snd_strerror(error) << '.'; @@ -69,6 +69,9 @@ namespace FreeDV { AudioFrameSamples / 2, AudioFrameSamples); + if ( handle == 0 ) + do_throw(-ENODEV); + snd_pcm_start(handle); } diff --git a/freedv-server/source/platform/linux/audio_out_alsa.cpp b/freedv-server/source/platform/linux/audio_out_alsa.cpp index deeb5145..d9e30c35 100644 --- a/freedv-server/source/platform/linux/audio_out_alsa.cpp +++ b/freedv-server/source/platform/linux/audio_out_alsa.cpp @@ -24,7 +24,7 @@ namespace FreeDV { { std::ostringstream str; - str << "Error on ALSA audio output " << parameters << ": "; + str << "Error on ALSA audio output \"" << parameters << "\": "; if ( message ) str << message << ": "; str << snd_strerror(error) << '.'; @@ -68,6 +68,9 @@ namespace FreeDV { SampleRate, AudioFrameSamples / 2, AudioFrameSamples); + + if ( handle == 0 ) + do_throw(-ENODEV); } AudioOutALSA::~AudioOutALSA() -- 2.25.1