summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Beierlein <tomjbe@gentoo.org>2010-02-09 13:59:00 +0000
committerThomas Beierlein <tomjbe@gentoo.org>2010-02-09 13:59:00 +0000
commite07663ce41bece8484caf405dd0919f4f30af00b (patch)
treea30349cd172a7ca0ea3d748ea26c9f94d7f48453 /media-radio/unixcw/files
parentmedia-radio/drm: Added gcc4.4 compatibility patch (diff)
downloadsunrise-e07663ce41bece8484caf405dd0919f4f30af00b.tar.gz
sunrise-e07663ce41bece8484caf405dd0919f4f30af00b.tar.bz2
sunrise-e07663ce41bece8484caf405dd0919f4f30af00b.zip
media-radio/unixcw: Fix some audio problems: sometimes alsa oss emulation handles mixer settings wrong and restoration of original audio volume level after finish of cw, cwcp and xcwcp
svn path=/sunrise/; revision=10012
Diffstat (limited to 'media-radio/unixcw/files')
-rw-r--r--media-radio/unixcw/files/unixcw-2.3-audio.patch147
1 files changed, 147 insertions, 0 deletions
diff --git a/media-radio/unixcw/files/unixcw-2.3-audio.patch b/media-radio/unixcw/files/unixcw-2.3-audio.patch
new file mode 100644
index 000000000..944cd91cc
--- /dev/null
+++ b/media-radio/unixcw/files/unixcw-2.3-audio.patch
@@ -0,0 +1,147 @@
+diff -ur unixcw-2.3.orig/src/cw/cw.c unixcw-2.3/src/cw/cw.c
+--- unixcw-2.3.orig/src/cw/cw.c 2006-06-18 23:58:46.000000000 +0200
++++ unixcw-2.3/src/cw/cw.c 2010-02-03 14:46:58.000000000 +0100
+@@ -922,5 +922,9 @@
+
+ /* Await final tone completion before exiting. */
+ cw_wait_for_tone_queue ();
++
++ /* Reset to ensure that the mixer volume gets restored. */
++ cw_complete_reset();
++
+ return EXIT_SUCCESS;
+ }
+Only in unixcw-2.3/src/cw: cw.o
+Only in unixcw-2.3/src/cwcp: cwcp
+diff -ur unixcw-2.3.orig/src/cwcp/cwcp.c unixcw-2.3/src/cwcp/cwcp.c
+--- unixcw-2.3.orig/src/cwcp/cwcp.c 2006-06-22 05:50:05.000000000 +0200
++++ unixcw-2.3/src/cwcp/cwcp.c 2010-02-03 14:48:31.000000000 +0100
+@@ -1625,6 +1625,9 @@
+ /* Attempt to wrestle the screen back from curses. */
+ interface_destroy ();
+
++ /* Reset to ensure that the mixer volumes gets restored */
++ cw_complete_reset();
++
+ /* Show the signal caught, and exit. */
+ fprintf (stderr, _("\nCaught signal %d, exiting...\n"), signal_number);
+ exit (EXIT_SUCCESS);
+@@ -1685,5 +1688,9 @@
+ /* Clean up and return. */
+ interface_destroy ();
+ cw_wait_for_tone_queue ();
++
++ /* Reset to ensure that the mixer volumes gets restored */
++ cw_complete_reset();
++
+ return EXIT_SUCCESS;
+ }
+diff -ur unixcw-2.3.orig/src/cwlib/cwlib.c unixcw-2.3/src/cwlib/cwlib.c
+--- unixcw-2.3.orig/src/cwlib/cwlib.c 2006-06-23 03:54:01.000000000 +0200
++++ unixcw-2.3/src/cwlib/cwlib.c 2010-02-04 19:36:32.000000000 +0100
+@@ -2138,12 +2138,33 @@
+ {
+ int read_volume, mixer, device_mask;
+
+- /* Try to use the main /dev/audio device for ioctls first. */
+- if (ioctl (cw_sound_descriptor,
+- MIXER_READ (SOUND_MIXER_PCM), &read_volume) == 0)
++ /* Try to use the main /dev/audio device for ioctls first.
++ * Check the available mixer channels for the audio file.
++ */
++ if (ioctl (cw_sound_descriptor, SOUND_MIXER_READ_DEVMASK, &device_mask) != -1)
+ {
+- *volume = read_volume;
+- return RC_SUCCESS;
++ /* Could read device_mask, so check availabel channels */
++ if (device_mask & SOUND_MASK_PCM)
++ /* First try PCM channel, ... */
++ {
++ if (ioctl (cw_sound_descriptor,
++ MIXER_READ (SOUND_MIXER_PCM), &read_volume) == 0)
++ {
++ *volume = read_volume;
++ return RC_SUCCESS;
++ }
++ }
++
++ if (device_mask & SOUND_MASK_VOLUME)
++ /* then master volume */
++ {
++ if (ioctl (cw_sound_descriptor,
++ MIXER_READ (SOUND_MIXER_VOLUME), &read_volume) == 0)
++ {
++ *volume = read_volume;
++ return RC_SUCCESS;
++ }
++ }
+ }
+
+ /* Volume not found; try the mixer PCM channel volume instead. */
+@@ -2215,13 +2236,35 @@
+ cw_set_sound_pcm_volume_internal (int volume)
+ {
+ int mixer, device_mask;
++ /* Try the mixer PCM channel volume instead. */
++ /* Try to use the main /dev/audio device for ioctls first.
++ * Check the available mixer channels for the audio file.
++ */
++ if (ioctl (cw_sound_descriptor, SOUND_MIXER_READ_DEVMASK, &device_mask) != -1)
++ {
++ /* Could read device_mask, so check availabel channels */
++ if (device_mask & SOUND_MASK_PCM)
++ /* First try PCM channel, ... */
++ {
++ if (ioctl (cw_sound_descriptor,
++ MIXER_WRITE (SOUND_MIXER_PCM), &volume) == 0)
++ {
++ return RC_SUCCESS;
++ }
++ }
++
++ if (device_mask & SOUND_MASK_VOLUME)
++ /* then master volume */
++ {
++ if (ioctl (cw_sound_descriptor,
++ MIXER_WRITE (SOUND_MIXER_VOLUME), &volume) == 0)
++ {
++ return RC_SUCCESS;
++ }
++ }
++ }
+
+- /* Try to use the main /dev/audio device for ioctls first. */
+- if (ioctl (cw_sound_descriptor,
+- MIXER_WRITE (SOUND_MIXER_PCM), &volume) == 0)
+- return RC_SUCCESS;
+
+- /* Try the mixer PCM channel volume instead. */
+ mixer = open (cw_mixer_device, O_RDWR | O_NONBLOCK);
+ if (mixer == -1)
+ {
+diff -ur unixcw-2.3.orig/src/xcwcp/application.cc unixcw-2.3/src/xcwcp/application.cc
+--- unixcw-2.3.orig/src/xcwcp/application.cc 2006-06-22 08:22:36.000000000 +0200
++++ unixcw-2.3/src/xcwcp/application.cc 2010-02-09 14:12:24.000000000 +0100
+@@ -498,6 +498,9 @@
+
+ // Done with the CW library sender for now.
+ cwlib_user_application_instance = NULL;
++
++ /* Reset to ensure that the mixer volumes gets restored */
++ cw_complete_reset();
+
+ file_menu_->setItemEnabled (file_start_id_, true);
+ file_menu_->setItemEnabled (file_stop_id_, false);
+diff -ur unixcw-2.3.orig/src/xcwcp/main.cc unixcw-2.3/src/xcwcp/main.cc
+--- unixcw-2.3.orig/src/xcwcp/main.cc 2006-06-18 23:39:34.000000000 +0200
++++ unixcw-2.3/src/xcwcp/main.cc 2010-02-09 14:06:17.000000000 +0100
+@@ -370,6 +370,9 @@
+ void
+ signal_handler (int signal_number)
+ {
++ /* Reset to ensure that the mixer volumes gets restored */
++ cw_complete_reset();
++
+ std::clog << _("Caught signal ") << signal_number
+ << _(", exiting...") << std::endl;
+ exit (EXIT_SUCCESS);