add binfolder path relative filters, fix gbrp color model, vwdw timebar tweaks, title...
[goodguy/history.git] / cinelerra-5.1 / cinelerra / audioalsa.C
index adb6c8bb0b9d80def3eaf073477d9ea9e714f13e..7a8d712c3b8f2687280dd33a9bccfa0925872c12 100644 (file)
@@ -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<char*> *alsa_titles = new ArrayList<char*>;
+               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<char*> *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<char*> *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<char*> *devices, int pcm_title, int mode)
                snd_ctl_close(handle);
        }
 
+#ifdef HAVE_PACTL
 // attempt to add pulseaudio "monitor" devices
 //  run: pactl list <sources>|<sinks>
 //   scan output for <Source/Sink> #n,  Name: <device>
@@ -214,12 +213,16 @@ void AudioALSA::list_devices(ArrayList<char*> *devices, int pcm_title, int mode)
                }
                pclose(pactl);
        }
+#endif
 }
 
 void AudioALSA::translate_name(char *output, char *input, int mode)
 {
        ArrayList<char*> titles;
+       titles.set_array_delete();
+
        ArrayList<char*> 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 ) {