X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Faudioalsa.C;h=7a8d712c3b8f2687280dd33a9bccfa0925872c12;hp=adb6c8bb0b9d80def3eaf073477d9ea9e714f13e;hb=7e5a0760f40ff787cc3d93cb7768a901ebe52809;hpb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd diff --git a/cinelerra-5.1/cinelerra/audioalsa.C b/cinelerra-5.1/cinelerra/audioalsa.C index adb6c8bb..7a8d712c 100644 --- a/cinelerra-5.1/cinelerra/audioalsa.C +++ b/cinelerra-5.1/cinelerra/audioalsa.C @@ -22,6 +22,7 @@ #include "audiodevice.h" #include "audioalsa.h" #include "bcsignals.h" +#include "language.h" #include "mutex.h" #include "playbackconfig.h" #include "preferences.h" @@ -58,6 +59,7 @@ public: // This is required in the top thread for Alsa to work alsa_leaks() { ArrayList *alsa_titles = new ArrayList; + alsa_titles->set_array_delete(); AudioALSA::list_devices(alsa_titles, 0, MODEPLAY); alsa_titles->remove_all_objects(); delete alsa_titles; @@ -74,9 +76,6 @@ void AudioALSA::list_devices(ArrayList *devices, int pcm_title, int mode) char string[BCTEXTLEN]; snd_pcm_stream_t stream = SND_PCM_STREAM_PLAYBACK; - devices->set_array_delete(); - - switch(mode) { case MODERECORD: @@ -95,7 +94,6 @@ void AudioALSA::list_devices(ArrayList *devices, int pcm_title, int mode) #define DEFAULT_DEVICE "default" char *result = new char[strlen(DEFAULT_DEVICE) + 1]; devices->append(result); - devices->set_array_delete(); // since we are allocating by new[] strcpy(result, DEFAULT_DEVICE); while(snd_card_next(&card) >= 0) @@ -159,6 +157,7 @@ void AudioALSA::list_devices(ArrayList *devices, int pcm_title, int mode) snd_ctl_close(handle); } +#ifdef HAVE_PACTL // attempt to add pulseaudio "monitor" devices // run: pactl list | // scan output for #n, Name: @@ -214,12 +213,16 @@ void AudioALSA::list_devices(ArrayList *devices, int pcm_title, int mode) } pclose(pactl); } +#endif } void AudioALSA::translate_name(char *output, char *input, int mode) { ArrayList titles; + titles.set_array_delete(); + ArrayList pcm_titles; + pcm_titles.set_array_delete(); list_devices(&titles, 0, mode); list_devices(&pcm_titles, 1, mode); @@ -271,7 +274,8 @@ int AudioALSA::set_params(snd_pcm_t *dsp, int mode, err = snd_pcm_hw_params_any(dsp, params); if (err < 0) { - fprintf(stderr, "AudioALSA::set_params: no PCM configurations available\n"); + fprintf(stderr, "AudioALSA::set_params: "); + fprintf(stderr, _("no PCM configurations available\n")); return 1; } @@ -279,8 +283,8 @@ int AudioALSA::set_params(snd_pcm_t *dsp, int mode, params, SND_PCM_ACCESS_RW_INTERLEAVED); if(err) { - fprintf(stderr, "AudioALSA::set_params: failed to set up " - "interleaved device access.\n"); + fprintf(stderr, "AudioALSA::set_params: "); + fprintf(stderr, _("failed to set up interleaved device access.\n")); return 1; } @@ -288,7 +292,8 @@ int AudioALSA::set_params(snd_pcm_t *dsp, int mode, params, translate_format(bits)); if(err) { - fprintf(stderr, "AudioALSA::set_params: failed to set output format.\n"); + fprintf(stderr, "AudioALSA::set_params: "); + fprintf(stderr, _("failed to set output format.\n")); return 1; } @@ -296,8 +301,8 @@ int AudioALSA::set_params(snd_pcm_t *dsp, int mode, params, channels); if(err) { - fprintf(stderr, "AudioALSA::set_params: Configured ALSA device " - "does not support %d channel operation.\n", + fprintf(stderr, "AudioALSA::set_params: "); + fprintf(stderr, _("Configured ALSA device does not support %d channel operation.\n"), channels); return 1; } @@ -307,8 +312,8 @@ int AudioALSA::set_params(snd_pcm_t *dsp, int mode, (unsigned int*)&samplerate, (int*)0); if(err) { - fprintf(stderr, "AudioALSA::set_params: Configured ALSA device " - "does not support %u Hz playback.\n", + fprintf(stderr, "AudioALSA::set_params: "); + fprintf(stderr, _(" Configured ALSA device does not support %u Hz playback.\n"), (unsigned int)samplerate); return 1; } @@ -382,7 +387,7 @@ int AudioALSA::open_input() translate_name(pcm_name, device->in_config->alsa_in_device,MODERECORD); //printf("AudioALSA::open_input %s\n", pcm_name); - err = snd_pcm_open(&dsp_in, device->in_config->alsa_in_device, stream, open_mode); + err = snd_pcm_open(&dsp_in, pcm_name, stream, open_mode); if(err < 0) { dsp_in = 0; @@ -427,7 +432,7 @@ int AudioALSA::open_output() return 1; } - set_params(dsp_out, MODEPLAY, + err = set_params(dsp_out, MODEPLAY, device->get_ochannels(), device->out_config->alsa_out_bits, device->out_samplerate, @@ -562,8 +567,8 @@ int AudioALSA::write_buffer(char *buffer, int size) timer->update(); AudioThread *audio_out = device->audio_out; - while(attempts < 2 && !done && !device->playback_interrupted) - { + while( count > 0 && attempts < 2 && !done ) { + if( device->playback_interrupted ) break; // Buffers written must be equal to period_time audio_out->Thread::enable_cancel(); int ret = snd_pcm_avail_update(get_output()); @@ -581,6 +586,7 @@ int AudioALSA::write_buffer(char *buffer, int size) if( ret > 0 ) ret = 0; } audio_out->Thread::disable_cancel(); + if( device->playback_interrupted ) break; if( ret == 0 ) continue; if( ret > 0 ) {