sys/oss/gstosssink.c: Parse spec to set correct oss values.
authorWim Taymans <wim.taymans@gmail.com>
Tue, 19 Jul 2005 19:03:26 +0000 (19:03 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Tue, 19 Jul 2005 19:03:26 +0000 (19:03 +0000)
Original commit message from CVS:
* sys/oss/gstosssink.c: (gst_oss_sink_get_format),
(gst_oss_sink_open):
Parse spec to set correct oss values.

ChangeLog
sys/oss/gstosssink.c

index 97e9a34ccb790ac92f790b2ba2ea776a851f39ae..ae4c13bdd7b573d69512a8edd190ab48156f7620 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2005-07-19  Wim Taymans  <wim@fluendo.com>
+
+       * sys/oss/gstosssink.c: (gst_oss_sink_get_format),
+       (gst_oss_sink_open):
+       Parse spec to set correct oss values.
+
 2005-07-19  Andy Wingo  <wingo@pobox.com>
 
        * ext/dv/gstdvdec.c (gst_dvdec_decode_video): Set the proper
index 788fa49d015c0753718aca7bc7332a3c5af90af5..2ad6d6190723f682baaeef710ca8dfa1d9ac158c 100644 (file)
@@ -221,6 +221,49 @@ G_STMT_START {                                     \
   }                                            \
 } G_STMT_END
 
+static gint
+gst_oss_sink_get_format (GstBufferFormat fmt)
+{
+  gint result;
+
+  switch (fmt) {
+    case GST_MU_LAW:
+      result = AFMT_MU_LAW;
+      break;
+    case GST_A_LAW:
+      result = AFMT_A_LAW;
+      break;
+    case GST_IMA_ADPCM:
+      result = AFMT_IMA_ADPCM;
+      break;
+    case GST_U8:
+      result = AFMT_U8;
+      break;
+    case GST_S16_LE:
+      result = AFMT_S16_LE;
+      break;
+    case GST_S16_BE:
+      result = AFMT_S16_BE;
+      break;
+    case GST_S8:
+      result = AFMT_S8;
+      break;
+    case GST_U16_LE:
+      result = AFMT_U16_LE;
+      break;
+    case GST_U16_BE:
+      result = AFMT_U16_BE;
+      break;
+    case GST_MPEG:
+      result = AFMT_MPEG;
+      break;
+    default:
+      result = 0;
+      break;
+  }
+  return result;
+}
+
 static gboolean
 gst_oss_sink_open (GstAudioSink * asink, GstRingBufferSpec * spec)
 {
@@ -243,10 +286,15 @@ gst_oss_sink_open (GstAudioSink * asink, GstRingBufferSpec * spec)
   mode &= ~O_NONBLOCK;
   fcntl (oss->fd, F_SETFL, mode);
 
-  SET_PARAM (oss, SNDCTL_DSP_SETFMT, AFMT_S16_LE);
-  SET_PARAM (oss, SNDCTL_DSP_STEREO, 1);
-  SET_PARAM (oss, SNDCTL_DSP_CHANNELS, 2);
-  SET_PARAM (oss, SNDCTL_DSP_SPEED, 44100);
+  tmp = gst_oss_sink_get_format (spec->format);
+  if (tmp == 0)
+    goto wrong_format;
+
+  SET_PARAM (oss, SNDCTL_DSP_SETFMT, tmp);
+  if (spec->channels == 2)
+    SET_PARAM (oss, SNDCTL_DSP_STEREO, 1);
+  SET_PARAM (oss, SNDCTL_DSP_CHANNELS, spec->channels);
+  SET_PARAM (oss, SNDCTL_DSP_SPEED, spec->rate);
 
   tmp = ilog2 (spec->segsize);
   tmp = ((spec->segtotal & 0x7fff) << 16) | tmp;
@@ -266,6 +314,12 @@ gst_oss_sink_open (GstAudioSink * asink, GstRingBufferSpec * spec)
       spec->segtotal, tmp);
 
   return TRUE;
+
+wrong_format:
+  {
+    GST_DEBUG ("wrong format %d\n", spec->format);
+    return FALSE;
+  }
 }
 
 static gboolean