sys/sunaudio/: Implement reset functions to unblock the src/sink more quickly on...
authorPadraig O'Briain <padraig.obriain@sun.com>
Fri, 8 Dec 2006 15:12:01 +0000 (15:12 +0000)
committerJan Schmidt <thaytan@mad.scientist.com>
Fri, 8 Dec 2006 15:12:01 +0000 (15:12 +0000)
Original commit message from CVS:
* sys/sunaudio/gstsunaudiosink.c: (gst_sunaudiosink_reset):
* sys/sunaudio/gstsunaudiosrc.c: (gst_sunaudiosrc_open),
(gst_sunaudiosrc_reset):
Implement reset functions to unblock the src/sink more quickly on
state change requests.
Patch by: Padraig O'Briain <padraig dot obriain at sun dot com>

ChangeLog
sys/sunaudio/gstsunaudiosink.c
sys/sunaudio/gstsunaudiosrc.c

index 8203634c8849959f792d844eb3423b4789627610..05de0d5be7687007f5320703f1643e26282778fa 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2006-12-08  Jan Schmidt  <thaytan@mad.scientist.com>
+
+       * sys/sunaudio/gstsunaudiosink.c: (gst_sunaudiosink_reset):
+       * sys/sunaudio/gstsunaudiosrc.c: (gst_sunaudiosrc_open),
+       (gst_sunaudiosrc_reset):
+
+       Implement reset functions to unblock the src/sink more quickly on 
+       state change requests.
+       Patch by: Padraig O'Briain <padraig dot obriain at sun dot com>
+
 2006-12-08  Jan Schmidt  <thaytan@mad.scientist.com>
 
        * sys/sunaudio/gstsunaudiomixer.c:
index 5c6e48f76b4057493901e9f9f1de2fc67f2633cb..ab7f4e3cadd8cf08fa95fb43d823927c51aed666 100644 (file)
@@ -42,6 +42,7 @@
 
 #include <fcntl.h>
 #include <string.h>
+#include <stropts.h>
 #include <unistd.h>
 #include <sys/mman.h>
 
@@ -390,4 +391,45 @@ gst_sunaudiosink_delay (GstAudioSink * asink)
 static void
 gst_sunaudiosink_reset (GstAudioSink * asink)
 {
+  /* Get current values */
+  GstSunAudioSink *sunaudiosink = GST_SUNAUDIO_SINK (asink);
+  audio_info_t ainfo;
+  int ret;
+
+  ret = ioctl (sunaudiosink->fd, AUDIO_GETINFO, &ainfo);
+  if (ret == -1) {
+    /*
+     * Should never happen, but if we couldn't getinfo, then no point
+     * trying to setinfo
+     */
+    GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s",
+            strerror (errno)));
+    return;
+  }
+
+  /*
+   * Pause the audio - so audio stops playing immediately rather than
+   * waiting for the ringbuffer to empty.
+   */
+  ainfo.play.pause = !NULL;
+  ret = ioctl (sunaudiosink->fd, AUDIO_SETINFO, &ainfo);
+  if (ret == -1) {
+    GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s",
+            strerror (errno)));
+  }
+
+  /* Flush the audio */
+  ret = ioctl (sunaudiosink->fd, I_FLUSH, FLUSHW);
+  if (ret == -1) {
+    GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s",
+            strerror (errno)));
+  }
+
+  /* unpause the audio */
+  ainfo.play.pause = NULL;
+  ret = ioctl (sunaudiosink->fd, AUDIO_SETINFO, &ainfo);
+  if (ret == -1) {
+    GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s",
+            strerror (errno)));
+  }
 }
index 0993ed979554f5057c4dcdbd110f4edaf692b47d..1a6ff969957f1523239664a623955f0f60cc5f68 100644 (file)
@@ -398,5 +398,45 @@ gst_sunaudiosrc_delay (GstAudioSrc * asrc)
 static void
 gst_sunaudiosrc_reset (GstAudioSrc * asrc)
 {
-  return;
+  /* Get current values */
+  GstSunAudioSrc *sunaudiosrc = GST_SUNAUDIO_SRC (asrc);
+  audio_info_t ainfo;
+  int ret;
+
+  ret = ioctl (sunaudiosrc->fd, AUDIO_GETINFO, &ainfo);
+  if (ret == -1) {
+    /*
+     * Should never happen, but if we couldn't getinfo, then no point
+     * trying to setinfo
+     */
+    GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, SETTINGS, (NULL), ("%s",
+            strerror (errno)));
+    return;
+  }
+
+  /*
+   * Pause the audio - so audio stops playing immediately rather than
+   * waiting for the ringbuffer to empty.
+   */
+  ainfo.record.pause = !NULL;
+  ret = ioctl (sunaudiosrc->fd, AUDIO_SETINFO, &ainfo);
+  if (ret == -1) {
+    GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, SETTINGS, (NULL), ("%s",
+            strerror (errno)));
+  }
+
+  /* Flush the audio */
+  ret = ioctl (sunaudiosrc->fd, I_FLUSH, FLUSHR);
+  if (ret == -1) {
+    GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, SETTINGS, (NULL), ("%s",
+            strerror (errno)));
+  }
+
+  /* unpause the audio */
+  ainfo.record.pause = NULL;
+  ret = ioctl (sunaudiosrc->fd, AUDIO_SETINFO, &ainfo);
+  if (ret == -1) {
+    GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, SETTINGS, (NULL), ("%s",
+            strerror (errno)));
+  }
 }