diff -uar gst-plugins-good-0.10_6.bak/sys/oss/gstossmixer.c gst-plugins-good-0.10.6/sys/oss/gstossmixer.c --- gst-plugins-good-0.10_6.bak/sys/oss/gstossmixer.c 2006-08-16 10:25:17.000000000 +0100 +++ gst-plugins-good-0.10.6/sys/oss/gstossmixer.c 2008-01-07 22:34:45.000000000 +0000 @@ -3,6 +3,8 @@ * * gstossmixer.c: mixer interface implementation for OSS * + * Adapted for OSSv4 by Clive Wright + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either @@ -31,6 +33,7 @@ #include #include +#if 0 #ifdef HAVE_OSS_INCLUDE_IN_SYS # include #else @@ -44,6 +47,9 @@ # endif /* HAVE_OSS_INCLUDE_IN_MACHINE */ # endif /* HAVE_OSS_INCLUDE_IN_ROOT */ #endif /* HAVE_OSS_INCLUDE_IN_SYS */ +#else +#include "/usr/lib/oss/include/sys/soundcard.h" +#endif #include @@ -55,6 +61,8 @@ #define MASK_BIT_IS_SET(mask, bit) \ (mask & (1 << bit)) +/* int i, n, ctrl, marker_seen, ossv4; +oss_mixext ext; */ static gboolean gst_ossmixer_open (GstOssMixer * mixer) @@ -69,6 +77,9 @@ if (mixer->mixer_fd == -1) goto open_failed; + n = 0; + if (ioctl (mixer->mixer_fd, SNDCTL_MIX_NREXT, &n) == -1 || n == 0) + { /* get masks */ if (ioctl (mixer->mixer_fd, SOUND_MIXER_READ_RECMASK, &mixer->recmask) < 0 || ioctl (mixer->mixer_fd, SOUND_MIXER_READ_RECSRC, &mixer->recdevs) < 0 @@ -78,6 +89,33 @@ || ioctl (mixer->mixer_fd, SOUND_MIXER_READ_CAPS, &mixer->mixcaps) < 0) goto masks_failed; + } + else + { + marker_seen = 0; + ossv4 = 0; + for (i = 0; i < n; i++) + { + ext.dev = 0; + ext.ctrl = i; + + if (ioctl (mixer->mixer_fd, SNDCTL_MIX_EXTINFO, &ext) == -1) + { + g_warning ("SNDCTL_MIX_EXTINFO"); + } + else + { + if (ext.type == MIXT_MARKER) marker_seen = 1; + if ((ext.flags & MIXF_PCMVOL) && marker_seen) + { + ctrl = i; + i = n; + mixer->devmask = 1; + ossv4 = 1; + } + } + } + } /* get name, not fatal */ g_free (mixer->cardname); #ifdef SOUND_MIXER_INFO @@ -241,6 +279,7 @@ gst_ossmixer_get_volume (GstOssMixer * mixer, GstMixerTrack * track, gint * volumes) { + oss_mixer_value val; gint volume; GstOssMixerTrack *osstrack = GST_OSSMIXER_TRACK (track); @@ -254,6 +293,7 @@ } } else { /* get */ + if (ossv4 == 0) { if (ioctl (mixer->mixer_fd, MIXER_READ (osstrack->track_num), &volume) < 0) { g_warning ("Error getting recording device (%d) volume: %s", osstrack->track_num, strerror (errno)); @@ -265,12 +305,39 @@ osstrack->rvol = volumes[1] = ((volume >> 8) & 0xff); } } + else + { + val.dev = 0; + val.ctrl = ctrl; + val.timestamp = ext.timestamp; + + if (ioctl (mixer->mixer_fd, SNDCTL_MIX_READ, &val) == -1) + { + if (errno == EIDRM) + { + g_warning ("Mixer structure changed."); + goto fail; + } + g_warning ("SNDCTL_MIX_READ"); + fail: volume = 0; + } + volume = ((val.value << 1) & 0xffff); + osstrack->lvol = volumes[0] = (volume / 5); + if (track->num_channels == 2) + { + volume = ((val.value >> 15) & 0xffff); + osstrack->rvol = volumes[1] = (volume / 5); + + } + } + } } void gst_ossmixer_set_volume (GstOssMixer * mixer, GstMixerTrack * track, gint * volumes) { + oss_mixer_value val; gint volume; GstOssMixerTrack *osstrack = GST_OSSMIXER_TRACK (track); @@ -285,12 +352,29 @@ } /* set */ + + if (ossv4 == 0) { if (ioctl (mixer->mixer_fd, MIXER_WRITE (osstrack->track_num), &volume) < 0) { g_warning ("Error setting recording device (%d) volume (0x%x): %s", osstrack->track_num, volume, strerror (errno)); return; } } + else + { + val.value = ((volume * 5 / 2) & 0xffff); + val.value |= (((volume * 5 / 2) & 0xffff) <<16); + val.dev = 0; + val.ctrl = ctrl; + val.timestamp = ext.timestamp; + + if (ioctl (mixer->mixer_fd, SNDCTL_MIX_WRITE, &val) < 0) + { + g_warning ("SNDCTL_MIX_WRITE"); + return; + } + } + } osstrack->lvol = volumes[0]; if (track->num_channels == 2) { @@ -302,6 +386,7 @@ gst_ossmixer_set_mute (GstOssMixer * mixer, GstMixerTrack * track, gboolean mute) { + oss_mixer_value val; int volume; GstOssMixerTrack *osstrack = GST_OSSMIXER_TRACK (track); @@ -317,12 +402,28 @@ } } + if (ossv4 == 0) { if (ioctl (mixer->mixer_fd, MIXER_WRITE (osstrack->track_num), &volume) < 0) { g_warning ("Error setting mixer recording device volume (0x%x): %s", volume, strerror (errno)); return; + } } + else + { + val.value = ((volume * 5 / 2) & 0xffff); + val.value |= (((volume * 5 / 2) & 0xffff) <<16); + val.dev = 0; + val.ctrl = ctrl; + val.timestamp = ext.timestamp; + + if (ioctl (mixer->mixer_fd, SNDCTL_MIX_WRITE, &val) < 0) + { + g_warning ("SNDCTL_MIX_WRITE"); + return; + } + } if (mute) { track->flags |= GST_MIXER_TRACK_MUTE; } else { diff -uar gst-plugins-good-0.10_6.bak/sys/oss/gstossmixertrack.c gst-plugins-good-0.10.6/sys/oss/gstossmixertrack.c --- gst-plugins-good-0.10_6.bak/sys/oss/gstossmixertrack.c 2005-12-10 14:57:48.000000000 +0000 +++ gst-plugins-good-0.10.6/sys/oss/gstossmixertrack.c 2008-01-07 22:32:39.000000000 +0000 @@ -3,6 +3,8 @@ * * gstossmixer.c: mixer interface implementation for OSS * + * Adapted for OSSv4 by Clive Wright + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either @@ -31,6 +33,7 @@ #include #include +#if 0 #ifdef HAVE_OSS_INCLUDE_IN_SYS # include #else @@ -44,6 +47,9 @@ # endif /* HAVE_OSS_INCLUDE_IN_MACHINE */ # endif /* HAVE_OSS_INCLUDE_IN_ROOT */ #endif /* HAVE_OSS_INCLUDE_IN_SYS */ +#else +#include "/usr/lib/oss/include/sys/soundcard.h" +#endif #include @@ -165,6 +171,7 @@ gst_ossmixer_track_new (gint mixer_fd, gint track_num, gint max_chans, gint flags) { + oss_mixer_value val; GstOssMixerTrack *osstrack; GstMixerTrack *track; gint volume; @@ -182,6 +189,7 @@ osstrack->track_num = track_num; /* volume */ + if (ossv4 == 0) { if (ioctl (mixer_fd, MIXER_READ (osstrack->track_num), &volume) < 0) { g_warning ("Error getting device (%d) volume: %s", osstrack->track_num, strerror (errno)); @@ -192,5 +200,29 @@ osstrack->rvol = ((volume >> 8) & 0xff); } + } + else { + val.dev = 0; + val.ctrl = ctrl; + val.timestamp = ext.timestamp; + + if (ioctl (mixer_fd, SNDCTL_MIX_READ, &val) == -1) + { + if (errno == EIDRM) + { + g_warning ("Mixer structure changed."); + goto fail; + } + g_warning ("SNDCTL_MIX_READ"); + fail: volume = 0; + } + volume = ((val.value << 1) & 0xffff); + osstrack->lvol = (volume / 5); + if (track->num_channels == 2) + { + volume = ((val.value >> 15) & 0xffff); + osstrack->rvol = (volume / 5); + } + } return track; } diff -uar gst-plugins-good-0.10_6.bak/sys/oss/gstossmixertrack.h gst-plugins-good-0.10.6/sys/oss/gstossmixertrack.h --- gst-plugins-good-0.10_6.bak/sys/oss/gstossmixertrack.h 2005-12-06 19:44:57.000000000 +0000 +++ gst-plugins-good-0.10.6/sys/oss/gstossmixertrack.h 2008-01-07 22:17:37.000000000 +0000 @@ -3,6 +3,8 @@ * * gstossmixertrack.h: OSS mixer tracks * + * Adapted for OSSv4 by Clive Wright + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either @@ -29,6 +31,9 @@ G_BEGIN_DECLS +int i, n, ctrl, marker_seen, ossv4; +oss_mixext ext; + #define GST_TYPE_OSSMIXER_TRACK \ (gst_ossmixer_track_get_type ()) #define GST_OSSMIXER_TRACK(obj) \