summaryrefslogtreecommitdiffstats
path: root/sys/sunaudio
diff options
context:
space:
mode:
authorPadraig O'Briain <padraig.obriain@sun.com>2006-12-08 15:12:01 +0000
committerJan Schmidt <thaytan@mad.scientist.com>2006-12-08 15:12:01 +0000
commita3b5d523d8edd62920bb4f75f67abdd574e24fb5 (patch)
treea12da421b5692405072960bf5b798fcc6dc514ec /sys/sunaudio
parentf3df7a85e48c90d0b057a414e1ef0c706928c91a (diff)
sys/sunaudio/: Implement reset functions to unblock the src/sink more quickly on state change requests.
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>
Diffstat (limited to 'sys/sunaudio')
-rw-r--r--sys/sunaudio/gstsunaudiosink.c42
-rw-r--r--sys/sunaudio/gstsunaudiosrc.c42
2 files changed, 83 insertions, 1 deletions
diff --git a/sys/sunaudio/gstsunaudiosink.c b/sys/sunaudio/gstsunaudiosink.c
index 5c6e48f7..ab7f4e3c 100644
--- a/sys/sunaudio/gstsunaudiosink.c
+++ b/sys/sunaudio/gstsunaudiosink.c
@@ -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)));
+ }
}
diff --git a/sys/sunaudio/gstsunaudiosrc.c b/sys/sunaudio/gstsunaudiosrc.c
index 0993ed97..1a6ff969 100644
--- a/sys/sunaudio/gstsunaudiosrc.c
+++ b/sys/sunaudio/gstsunaudiosrc.c
@@ -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)));
+ }
}