diff -ru pwlib-orig/plugins/sound_alsa/sound_alsa.cxx pwlib/plugins/sound_alsa/sound_alsa.cxx --- pwlib-orig/plugins/sound_alsa/sound_alsa.cxx 2004-03-13 13:36:14.000000000 +0100 +++ pwlib/plugins/sound_alsa/sound_alsa.cxx 2004-10-21 18:33:38.562610536 +0200 @@ -28,6 +28,21 @@ * Contributor(s): / * * $Log: sound_alsa.cxx,v $ + * Revision 1.21 2004/10/18 11:43:39 dsandras + * Use Capture instead of Mic when changing the volume. Use the correct mixer when using the Default device. + * + * Revision 1.20 2004/10/14 19:30:16 dsandras + * Removed DMIX and DSNOOP plugins and added support for DEFAULT as it is the correcti way to do things. + * + * Revision 1.19 2004/08/30 21:09:41 dsandras + * Added DSNOOP plugin support. + * + * Revision 1.18 2004/05/14 10:15:26 dominance + * Fixes direct opening of sound output devices. The list of devices does no longer return NULL in that case. Patch provided by Julien Puydt . + * + * Revision 1.17 2004/04/03 10:33:45 dsandras + * Use PStringToOrdinal to store the detected devices, that fixes problems if there is a discontinuity in the succession of soundcard ID's. For example the user has card ID 1 and 3, but not 2. + * * Revision 1.16 2004/03/13 12:36:14 dsandras * Added support for DMIX plugin output. * @@ -81,8 +96,8 @@ PCREATE_SOUND_PLUGIN(ALSA, PSoundChannelALSA) -static PStringArray playback_devices; -static PStringArray capture_devices; +static PStringToOrdinal playback_devices; +static PStringToOrdinal capture_devices; /////////////////////////////////////////////////////////////////////////////// @@ -119,8 +134,9 @@ } -PStringArray PSoundChannelALSA::GetDeviceNames (Directions dir) +void PSoundChannelALSA::UpdateDictionary (Directions dir) { + int card = -1, dev = -1; snd_ctl_t *handle = NULL; @@ -134,12 +150,12 @@ if (dir == Recorder) { stream = SND_PCM_STREAM_CAPTURE; - capture_devices = PStringArray (); + capture_devices = PStringToOrdinal (); } else { stream = SND_PCM_STREAM_PLAYBACK; - playback_devices = PStringArray (); + playback_devices = PStringToOrdinal (); } snd_ctl_card_info_alloca (&info); @@ -148,7 +164,7 @@ /* No sound card found */ if (snd_card_next (&card) < 0 || card < 0) { - return PStringArray (); + return; } @@ -176,13 +192,11 @@ snd_card_get_name (card, &name); if (dir == Recorder) { - if (capture_devices.GetStringsIndex (name) == P_MAX_INDEX) - capture_devices.AppendString (name); + capture_devices.SetAt (name, card); } else { - if (playback_devices.GetStringsIndex (name) == P_MAX_INDEX) - playback_devices.AppendString (name); + playback_devices.SetAt (name, card); } free (name); @@ -193,17 +207,27 @@ snd_ctl_close(handle); snd_card_next (&card); } +} - - if (dir == Recorder) - return capture_devices; - else { +PStringArray PSoundChannelALSA::GetDeviceNames (Directions dir) +{ + PStringArray devices; + PStringToOrdinal devices_dict; - if (playback_devices.GetSize () > 0) - playback_devices += "DMIX Plugin"; + if (dir == Recorder) + devices_dict = capture_devices; + else + devices_dict = playback_devices; + + UpdateDictionary (dir); + + if (devices_dict.GetSize () > 0) + devices += "Default"; + + for (PINDEX j = 0 ; j < devices_dict.GetSize () ; j++) + devices += devices_dict.GetKeyAt (j); - return playback_devices; - } + return devices; } @@ -223,7 +247,7 @@ unsigned _bitsPerSample) { PString real_device_name; - PINDEX i = 0; + POrdinalKey *i = NULL; snd_pcm_stream_t stream; Close(); @@ -236,21 +260,31 @@ stream = SND_PCM_STREAM_PLAYBACK; /* Open in NONBLOCK mode */ - if (_dir != Recorder && _device == "DMIX Plugin") { + if (_device == "Default") { - real_device_name = "plug:dmix"; + real_device_name = "default"; + card_nr = -2; } - else if ((i = (_dir == Recorder) ? capture_devices.GetStringsIndex (_device) : playback_devices.GetStringsIndex (_device)) != P_MAX_INDEX) { + else { + + if ((_dir == Recorder && capture_devices.IsEmpty ()) + || (_dir == Player && playback_devices.IsEmpty ())) + UpdateDictionary (_dir); + + i = (_dir == Recorder) ? capture_devices.GetAt (_device) : playback_devices.GetAt (_device); - real_device_name = "plughw:" + PString (i); - card_nr = i; + if (i) { + + real_device_name = "plughw:" + PString (*i); + card_nr = *i; + } + else { + + PTRACE (1, "ALSA\tDevice not found"); + return FALSE; + } } - else { - PTRACE (1, "ALSA\tDevice unavailable"); - return FALSE; - } - if (snd_pcm_open (&os_handle, real_device_name, stream, SND_PCM_NONBLOCK) < 0) { PTRACE (1, "ALSA\tOpen Failed"); @@ -735,7 +769,7 @@ snd_mixer_elem_t *elem; snd_mixer_selem_id_t *sid; - const char *play_mix_name = (direction == Player) ? "PCM": "Mic"; + const char *play_mix_name = (direction == Player) ? "PCM": "Capture"; PString card_name; long pmin = 0, pmax = 0; @@ -744,7 +778,10 @@ if (!os_handle) return FALSE; - card_name = "hw:" + PString (card_nr); + if (card_nr == -2) + card_name = "default"; + else + card_name = "hw:" + PString (card_nr); //allocate simple id snd_mixer_selem_id_alloca (&sid); @@ -796,23 +833,39 @@ return FALSE; } - snd_mixer_selem_get_playback_volume_range (elem, &pmin, &pmax); if (set) { - - vol = (set_vol * (pmax?pmax:31)) / 100; - snd_mixer_selem_set_playback_volume (elem, - SND_MIXER_SCHN_FRONT_LEFT, vol); - snd_mixer_selem_set_playback_volume (elem, - SND_MIXER_SCHN_FRONT_RIGHT, vol); + if (direction == Player) { + + snd_mixer_selem_get_playback_volume_range (elem, &pmin, &pmax); + vol = (set_vol * (pmax?pmax:31)) / 100; + snd_mixer_selem_set_playback_volume_all (elem, vol); + } + else { + + snd_mixer_selem_get_capture_volume_range (elem, &pmin, &pmax); + vol = (set_vol * (pmax?pmax:31)) / 100; + snd_mixer_selem_set_capture_volume_all (elem, vol); + } PTRACE (4, "Set volume to " << vol); } else { - snd_mixer_selem_get_playback_volume (elem, - SND_MIXER_SCHN_FRONT_LEFT, &vol); + if (direction == Player) { + + snd_mixer_selem_get_playback_volume_range (elem, &pmin, &pmax); + snd_mixer_selem_get_playback_volume (elem, SND_MIXER_SCHN_FRONT_LEFT, + &vol); + } + else { + + snd_mixer_selem_get_capture_volume_range (elem, &pmin, &pmax); + snd_mixer_selem_get_capture_volume (elem, SND_MIXER_SCHN_FRONT_LEFT, + &vol); + } get_vol = (vol * 100) / (pmax?pmax:31); + PTRACE (4, "Got volume " << vol); } Only in pwlib/plugins/sound_alsa: .sound_alsa.cxx-patch.swp diff -ru pwlib-orig/plugins/sound_alsa/sound_alsa.h pwlib/plugins/sound_alsa/sound_alsa.h --- pwlib-orig/plugins/sound_alsa/sound_alsa.h 2003-12-28 16:10:35.000000000 +0100 +++ pwlib/plugins/sound_alsa/sound_alsa.h 2004-10-21 18:35:51.559391952 +0200 @@ -89,7 +89,8 @@ BOOL IsOpen() const; private: - + + static void UpdateDictionary(PSoundChannel::Directions); BOOL Volume (BOOL, unsigned, unsigned &); PSoundChannel::Directions direction; PString device;