X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Faudioalsa.C;h=4a128a74a3586a20ca3ff8ce60ea60d5aa6499b7;hp=e5c9fdfbd1b7ca15271cddffbdc5a46e78d89955;hb=9e3d90a964c0fbe97c0b58235336a47111932d5d;hpb=bb755e4be7602e9e2705fdb49a76e49dbb2c5008 diff --git a/cinelerra-5.1/cinelerra/audioalsa.C b/cinelerra-5.1/cinelerra/audioalsa.C index e5c9fdfb..4a128a74 100644 --- a/cinelerra-5.1/cinelerra/audioalsa.C +++ b/cinelerra-5.1/cinelerra/audioalsa.C @@ -145,64 +145,6 @@ void AudioALSA::list_devices(ArrayList *names, ArrayList *pcm_name snd_ctl_close(handle); } - -#ifdef HAVE_PACTL -// attempt to add pulseaudio "monitor" devices -// run: pactl list | -// scan output for #n, Name: -// build alsa device config and add to alsa snd_config - - const char *arg = 0; - switch( mode ) { - case MODERECORD: - arg = "source"; - break; - case MODEPLAY: - arg = "sink"; - break; - } - FILE *pactl = 0; - char line[BCTEXTLEN]; - if( arg ) { - sprintf(line, "LANGUAGE=en_US.UTF-8 pactl list %ss", arg); - pactl = popen(line,"r"); - } - if( pactl ) { - snd_config_update(); - char name[BCTEXTLEN], pa_name[BCTEXTLEN], device[BCTEXTLEN]; - name[0] = pa_name[0] = device[0] = 0; - int arg_len = strlen(arg); - while( fgets(line, sizeof(line), pactl) ) { - if( !strncasecmp(line, arg, arg_len) ) { - char *sp = name, *id = pa_name; - for( char *cp=line; *cp && *cp!='\n'; *sp++=*cp++ ) - *id++ = (*cp>='A' && *cp<='Z') || - (*cp>='a' && *cp<='z') || - (*cp>='0' && *cp<='9') ? *cp : '_'; - *sp++ = 0; *id = 0; - if( names ) - names->append(cstrdup(name)); - continue; - } - if( sscanf(line, " Name: %s", device) != 1 ) continue; - int len = strlen(pa_name); - if( pcm_names ) - pcm_names->append(cstrdup(pa_name)); - char alsa_config[BCTEXTLEN]; - len = snprintf(alsa_config, sizeof(alsa_config), - "pcm.!%s {\n type pulse\n device %s\n}\n" - "ctl.!%s {\n type pulse\n device %s\n}\n", - pa_name, device, pa_name, device); - FILE *fp = fmemopen(alsa_config,len,"r"); - snd_input_t *inp; - snd_input_stdio_attach(&inp, fp, 1); - snd_config_load(snd_config, inp); - name[0] = pa_name[0] = device[0] = 0; - snd_input_close(inp); - } - pclose(pactl); - } -#endif } void AudioALSA::translate_name(char *output, char *input, int mode) @@ -215,6 +157,9 @@ void AudioALSA::translate_name(char *output, char *input, int mode) list_devices(&titles, &pcm_titles, mode); +// attempt to add pulseaudio "monitor" devices + add_pulse_devices(mode, &titles, &pcm_titles); + sprintf(output, "default"); for(int i = 0; i < titles.total; i++) { @@ -676,4 +621,64 @@ snd_pcm_t* AudioALSA::get_input() return dsp_in; } +void AudioALSA::add_pulse_devices(int mode, + ArrayList *names, ArrayList *pcm_names) +{ +#ifdef HAVE_PACTL +// run: pactl list | +// scan output for #n, Name: +// build alsa device config and add to alsa snd_config + const char *arg = 0; + switch( mode ) { + case MODERECORD: + arg = "source"; + break; + case MODEPLAY: + arg = "sink"; + break; + } + FILE *pactl = 0; + char line[BCTEXTLEN]; + if( arg ) { + sprintf(line, "LANGUAGE=en_US.UTF-8 pactl list %ss", arg); + pactl = popen(line,"r"); + } + if( pactl ) { + snd_config_update(); + char name[BCTEXTLEN], pa_name[BCTEXTLEN], device[BCTEXTLEN]; + name[0] = pa_name[0] = device[0] = 0; + int arg_len = strlen(arg); + while( fgets(line, sizeof(line), pactl) ) { + if( !strncasecmp(line, arg, arg_len) ) { + char *sp = name, *id = pa_name; + for( char *cp=line; *cp && *cp!='\n'; *sp++=*cp++ ) + *id++ = (*cp>='A' && *cp<='Z') || + (*cp>='a' && *cp<='z') || + (*cp>='0' && *cp<='9') ? *cp : '_'; + *sp++ = 0; *id = 0; + if( names ) + names->append(cstrdup(name)); + continue; + } + if( sscanf(line, " Name: %s", device) != 1 ) continue; + int len = strlen(pa_name); + if( pcm_names ) + pcm_names->append(cstrdup(pa_name)); + char alsa_config[BCTEXTLEN]; + len = snprintf(alsa_config, sizeof(alsa_config), + "pcm.!%s {\n type pulse\n device %s\n}\n" + "ctl.!%s {\n type pulse\n device %s\n}\n", + pa_name, device, pa_name, device); + FILE *fp = fmemopen(alsa_config,len,"r"); + snd_input_t *inp; + snd_input_stdio_attach(&inp, fp, 1); + snd_config_load(snd_config, inp); + name[0] = pa_name[0] = device[0] = 0; + snd_input_close(inp); + } + pclose(pactl); + } +#endif +} + #endif