diff options
author | Jan Schmidt <thaytan@mad.scientist.com> | 2007-06-08 17:36:46 +0000 |
---|---|---|
committer | Jan Schmidt <thaytan@mad.scientist.com> | 2007-06-08 17:36:46 +0000 |
commit | dbf7acdf1d2218ba986021a3d6439cf848fd9162 (patch) | |
tree | 386e9afa04063b7efe64626e06c939ae9a03b7bb /sys/directsound | |
parent | 0f7d9f156a06d0226b1a2b3b70e2786b9bf71e2b (diff) | |
download | gstreamer-plugins-bad-dbf7acdf1d2218ba986021a3d6439cf848fd9162.tar.gz |
Remove DirectDraw & DirectSound plugins, as they've moved to Good
Original commit message from CVS:
* configure.ac:
* docs/plugins/Makefile.am:
* docs/plugins/gst-plugins-bad-plugins-docs.sgml:
* docs/plugins/gst-plugins-bad-plugins-sections.txt:
* docs/plugins/gst-plugins-bad-plugins.args:
* docs/plugins/inspect/plugin-directdraw.xml:
* docs/plugins/inspect/plugin-directsound.xml:
* sys/Makefile.am:
* sys/directdraw/Makefile.am:
* sys/directdraw/gstdirectdrawplugin.c:
* sys/directdraw/gstdirectdrawsink.c:
* sys/directdraw/gstdirectdrawsink.h:
* sys/directsound/Makefile.am:
* sys/directsound/gstdirectsoundplugin.c:
* sys/directsound/gstdirectsoundsink.c:
* sys/directsound/gstdirectsoundsink.h:
* win32/MANIFEST:
* win32/gst.sln:
* win32/vs6/libgstdirectdraw.dsp:
* win32/vs6/libgstdirectsound.dsp:
* win32/vs7/libgstdirectdraw.vcproj:
* win32/vs7/libgstdirectsound.vcproj:
* win32/vs8/libgstdirectdraw.vcproj:
* win32/vs8/libgstdirectsound.vcproj:
Remove DirectDraw & DirectSound plugins, as they've moved to Good
Diffstat (limited to 'sys/directsound')
-rw-r--r-- | sys/directsound/Makefile.am | 9 | ||||
-rw-r--r-- | sys/directsound/gstdirectsoundplugin.c | 49 | ||||
-rw-r--r-- | sys/directsound/gstdirectsoundsink.c | 582 | ||||
-rw-r--r-- | sys/directsound/gstdirectsoundsink.h | 89 |
4 files changed, 0 insertions, 729 deletions
diff --git a/sys/directsound/Makefile.am b/sys/directsound/Makefile.am deleted file mode 100644 index 3b24de626..000000000 --- a/sys/directsound/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -plugin_LTLIBRARIES = libgstdirectsoundsink.la
-
-libgstdirectsoundsink_la_SOURCES = gstdirectsoundsink.c gstdirectsoundplugin.c
-libgstdirectsoundsink_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \
- $(GST_PLUGINS_BASE_CFLAGS) $(DIRECTSOUND_CFLAGS)
-libgstdirectsoundsink_la_LIBADD = $(DIRECTSOUND_LIBS) \
- $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) \
- -lgstaudio-$(GST_MAJORMINOR) -lgstinterfaces-$(GST_MAJORMINOR)
-libgstdirectsoundsink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(DIRECTSOUND_LDFLAGS)
diff --git a/sys/directsound/gstdirectsoundplugin.c b/sys/directsound/gstdirectsoundplugin.c deleted file mode 100644 index 1af665a2f..000000000 --- a/sys/directsound/gstdirectsoundplugin.c +++ /dev/null @@ -1,49 +0,0 @@ -/* GStreamer -* Copyright (C) 2005 Sebastien Moutte <sebastien@moutte.net> -* Copyright (C) 2007 Pioneers of the Inevitable <songbird@songbirdnest.com> -* -* gstdirectsoundplugin.c: -* -* 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 -* version 2 of the License, or (at your option) any later version. -* -* This library is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Library General Public License for more details. -* -* You should have received a copy of the GNU Library General Public -* License along with this library; if not, write to the -* Free Software Foundation, Inc., 59 Temple Place - Suite 330, -* Boston, MA 02111-1307, USA. -* -* -* The development of this code was made possible due to the involvement -* of Pioneers of the Inevitable, the creators of the Songbird Music player -* -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstdirectsoundsink.h" - - -static gboolean -plugin_init (GstPlugin * plugin) -{ - if (!gst_element_register (plugin, "directsoundsink", GST_RANK_PRIMARY, - GST_TYPE_DIRECTSOUND_SINK)) - return FALSE; - - return TRUE; -} - -GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "directsound", - "Direct Sound plugin library", - plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/sys/directsound/gstdirectsoundsink.c b/sys/directsound/gstdirectsoundsink.c deleted file mode 100644 index 97127bdb8..000000000 --- a/sys/directsound/gstdirectsoundsink.c +++ /dev/null @@ -1,582 +0,0 @@ -/* GStreamer -* Copyright (C) 2005 Sebastien Moutte <sebastien@moutte.net> -* Copyright (C) 2007 Pioneers of the Inevitable <songbird@songbirdnest.com> -* -* gstdirectsoundsink.c: -* -* 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 -* version 2 of the License, or (at your option) any later version. -* -* This library is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Library General Public License for more details. -* -* You should have received a copy of the GNU Library General Public -* License along with this library; if not, write to the -* Free Software Foundation, Inc., 59 Temple Place - Suite 330, -* Boston, MA 02111-1307, USA. -* -* -* The development of this code was made possible due to the involvement -* of Pioneers of the Inevitable, the creators of the Songbird Music player -* -*/ - -/** - * SECTION:element-directsoundsink - * @short_description: output sound using Directsound API - * - * <refsect2> - * <para> - * This element lets you output sound using the DirectSound API. - * </para> - * <para> - * Note that you should almost always use generic audio conversion elements - * like audioconvert and audioresample in front of an audiosink to make sure - * your pipeline works under all circumstances (those conversion elements will - * act in passthrough-mode if no conversion is necessary). - * </para> - * <title>Example pipelines</title> - * <para> - * <programlisting> - * gst-launch-0.10 -v audiotestsrc ! audioconvert ! volume volume=0.1 ! directsoundsink - * </programlisting> - * will output a sine wave (continuous beep sound) to your sound card (with - * a very low volume as precaution). - * </para> - * <para> - * <programlisting> - * gst-launch-0.10 -v filesrc location=music.ogg ! decodebin ! audioconvert ! audioresample ! directsoundsink - * </programlisting> - * will play an Ogg/Vorbis audio file and output it. - * </para> - * </refsect2> - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstdirectsoundsink.h" - -GST_DEBUG_CATEGORY_STATIC (directsoundsink_debug); - -/* elementfactory information */ -static const GstElementDetails gst_directsound_sink_details = -GST_ELEMENT_DETAILS ("Direct Sound Audio Sink", - "Sink/Audio", - "Output to a sound card via Direct Sound", - "Sebastien Moutte <sebastien@moutte.net>"); - -static void gst_directsound_sink_base_init (gpointer g_class); -static void gst_directsound_sink_class_init (GstDirectSoundSinkClass * klass); -static void gst_directsound_sink_init (GstDirectSoundSink * dsoundsink, - GstDirectSoundSinkClass * g_class); -static void gst_directsound_sink_finalise (GObject * object); - -static GstCaps *gst_directsound_sink_getcaps (GstBaseSink * bsink); -static gboolean gst_directsound_sink_prepare (GstAudioSink * asink, - GstRingBufferSpec * spec); -static gboolean gst_directsound_sink_unprepare (GstAudioSink * asink); - -static gboolean gst_directsound_sink_open (GstAudioSink * asink); -static gboolean gst_directsound_sink_close (GstAudioSink * asink); -static guint gst_directsound_sink_write (GstAudioSink * asink, gpointer data, - guint length); -static guint gst_directsound_sink_delay (GstAudioSink * asink); -static void gst_directsound_sink_reset (GstAudioSink * asink); - -/* interfaces */ -static void gst_directsound_sink_interfaces_init (GType type); -static void -gst_directsound_sink_implements_interface_init (GstImplementsInterfaceClass * - iface); -static void gst_directsound_sink_mixer_interface_init (GstMixerClass * iface); - -static GstStaticPadTemplate directsoundsink_sink_factory = - GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-raw-int, " - "signed = (boolean) { TRUE, FALSE }, " - "width = (int) 16, " - "depth = (int) 16, " - "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]; " - "audio/x-raw-int, " - "signed = (boolean) { TRUE, FALSE }, " - "width = (int) 8, " - "depth = (int) 8, " - "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]")); - -GST_BOILERPLATE_FULL (GstDirectSoundSink, gst_directsound_sink, GstAudioSink, - GST_TYPE_AUDIO_SINK, gst_directsound_sink_interfaces_init); - -/* interfaces stuff */ -static void -gst_directsound_sink_interfaces_init (GType type) -{ - static const GInterfaceInfo implements_interface_info = { - (GInterfaceInitFunc) gst_directsound_sink_implements_interface_init, - NULL, - NULL, - }; - - static const GInterfaceInfo mixer_interface_info = { - (GInterfaceInitFunc) gst_directsound_sink_mixer_interface_init, - NULL, - NULL, - }; - - g_type_add_interface_static (type, - GST_TYPE_IMPLEMENTS_INTERFACE, &implements_interface_info); - g_type_add_interface_static (type, GST_TYPE_MIXER, &mixer_interface_info); -} - -static gboolean -gst_directsound_sink_interface_supported (GstImplementsInterface * iface, - GType iface_type) -{ - g_return_val_if_fail (iface_type == GST_TYPE_MIXER, FALSE); - - /* for the sake of this example, we'll always support it. However, normally, - * you would check whether the device you've opened supports mixers. */ - return TRUE; -} - -static void -gst_directsound_sink_implements_interface_init (GstImplementsInterfaceClass * - iface) -{ - iface->supported = gst_directsound_sink_interface_supported; -} - -/* - * This function returns the list of support tracks (inputs, outputs) - * on this element instance. Elements usually build this list during - * _init () or when going from NULL to READY. - */ - -static const GList * -gst_directsound_sink_mixer_list_tracks (GstMixer * mixer) -{ - GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (mixer); - - return dsoundsink->tracks; -} - -/* - * Set volume. volumes is an array of size track->num_channels, and - * each value in the array gives the wanted volume for one channel - * on the track. - */ - -static void -gst_directsound_sink_mixer_set_volume (GstMixer * mixer, - GstMixerTrack * track, gint * volumes) -{ - GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (mixer); - - if (volumes[0] != dsoundsink->volume) { - dsoundsink->volume = volumes[0]; - - if (dsoundsink->pDSBSecondary) { - /* DirectSound is using attenuation in the following range - * (DSBVOLUME_MIN=-10000, DSBVOLUME_MAX=0) */ - glong ds_attenuation = DSBVOLUME_MIN + (dsoundsink->volume * 100); - - IDirectSoundBuffer_SetVolume (dsoundsink->pDSBSecondary, ds_attenuation); - } - } -} - -static void -gst_directsound_sink_mixer_get_volume (GstMixer * mixer, - GstMixerTrack * track, gint * volumes) -{ - GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (mixer); - - volumes[0] = dsoundsink->volume; -} - -static void -gst_directsound_sink_mixer_interface_init (GstMixerClass * iface) -{ - /* the mixer interface requires a definition of the mixer type: - * hardware or software? */ - GST_MIXER_TYPE (iface) = GST_MIXER_SOFTWARE; - - /* virtual function pointers */ - iface->list_tracks = gst_directsound_sink_mixer_list_tracks; - iface->set_volume = gst_directsound_sink_mixer_set_volume; - iface->get_volume = gst_directsound_sink_mixer_get_volume; -} - -static void -gst_directsound_sink_finalise (GObject * object) -{ - GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (object); - - g_mutex_free (dsoundsink->dsound_lock); - - if (dsoundsink->tracks) { - g_list_foreach (dsoundsink->tracks, (GFunc) g_object_unref, NULL); - g_list_free (dsoundsink->tracks); - dsoundsink->tracks = NULL; - } - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -static void -gst_directsound_sink_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_set_details (element_class, &gst_directsound_sink_details); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&directsoundsink_sink_factory)); -} - -static void -gst_directsound_sink_class_init (GstDirectSoundSinkClass * klass) -{ - GObjectClass *gobject_class; - GstElementClass *gstelement_class; - GstBaseSinkClass *gstbasesink_class; - GstBaseAudioSinkClass *gstbaseaudiosink_class; - GstAudioSinkClass *gstaudiosink_class; - - gobject_class = (GObjectClass *) klass; - gstelement_class = (GstElementClass *) klass; - gstbasesink_class = (GstBaseSinkClass *) klass; - gstbaseaudiosink_class = (GstBaseAudioSinkClass *) klass; - gstaudiosink_class = (GstAudioSinkClass *) klass; - - GST_DEBUG_CATEGORY_INIT (directsoundsink_debug, "directsoundsink", 0, - "DirectSound sink"); - - parent_class = g_type_class_peek_parent (klass); - - gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_directsound_sink_finalise); - - gstbasesink_class->get_caps = - GST_DEBUG_FUNCPTR (gst_directsound_sink_getcaps); - - gstaudiosink_class->prepare = - GST_DEBUG_FUNCPTR (gst_directsound_sink_prepare); - gstaudiosink_class->unprepare = - GST_DEBUG_FUNCPTR (gst_directsound_sink_unprepare); - gstaudiosink_class->open = GST_DEBUG_FUNCPTR (gst_directsound_sink_open); - gstaudiosink_class->close = GST_DEBUG_FUNCPTR (gst_directsound_sink_close); - gstaudiosink_class->write = GST_DEBUG_FUNCPTR (gst_directsound_sink_write); - gstaudiosink_class->delay = GST_DEBUG_FUNCPTR (gst_directsound_sink_delay); - gstaudiosink_class->reset = GST_DEBUG_FUNCPTR (gst_directsound_sink_reset); -} - -static void -gst_directsound_sink_init (GstDirectSoundSink * dsoundsink, - GstDirectSoundSinkClass * g_class) -{ - GstMixerTrack *track = NULL; - - dsoundsink->tracks = NULL; - track = g_object_new (GST_TYPE_MIXER_TRACK, NULL); - track->label = g_strdup ("DSoundTrack"); - track->num_channels = 2; - track->min_volume = 0; - track->max_volume = 100; - track->flags = GST_MIXER_TRACK_OUTPUT; - dsoundsink->tracks = g_list_append (dsoundsink->tracks, track); - - dsoundsink->pDS = NULL; - dsoundsink->pDSBSecondary = NULL; - dsoundsink->current_circular_offset = 0; - dsoundsink->buffer_size = DSBSIZE_MIN; - dsoundsink->volume = 100; - dsoundsink->dsound_lock = g_mutex_new (); - dsoundsink->first_buffer_after_reset = FALSE; -} - -static GstCaps * -gst_directsound_sink_getcaps (GstBaseSink * bsink) -{ - GstDirectSoundSink *dsoundsink; - - dsoundsink = GST_DIRECTSOUND_SINK (bsink); - - return - gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SINK_PAD - (dsoundsink))); -} - -static gboolean -gst_directsound_sink_open (GstAudioSink * asink) -{ - GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (asink); - HRESULT hRes; - - /* create and initialize a DirecSound object */ - if (FAILED (hRes = DirectSoundCreate (NULL, &dsoundsink->pDS, NULL))) { - GST_ELEMENT_ERROR (dsoundsink, RESOURCE, OPEN_READ, - ("gst_directsound_sink_open: DirectSoundCreate: %s", - DXGetErrorString9 (hRes)), (NULL)); - return FALSE; - } - - if (FAILED (hRes = IDirectSound_SetCooperativeLevel (dsoundsink->pDS, - GetDesktopWindow (), DSSCL_PRIORITY))) { - GST_ELEMENT_ERROR (dsoundsink, RESOURCE, OPEN_READ, - ("gst_directsound_sink_open: IDirectSound_SetCooperativeLevel: %s", - DXGetErrorString9 (hRes)), (NULL)); - return FALSE; - } - - return TRUE; -} - -static gboolean -gst_directsound_sink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec) -{ - GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (asink); - HRESULT hRes; - DSBUFFERDESC descSecondary; - WAVEFORMATEX wfx; - - /*save number of bytes per sample */ - dsoundsink->bytes_per_sample = spec->bytes_per_sample; - - /* fill the WAVEFORMATEX struture with spec params */ - memset (&wfx, 0, sizeof (wfx)); - wfx.cbSize = sizeof (wfx); - wfx.wFormatTag = WAVE_FORMAT_PCM; - wfx.nChannels = spec->channels; - wfx.nSamplesPerSec = spec->rate; - wfx.wBitsPerSample = (spec->bytes_per_sample * 8) / wfx.nChannels; - wfx.nBlockAlign = spec->bytes_per_sample; - wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; - - /* directsound buffer size can handle 1/2 sec of the stream */ - dsoundsink->buffer_size = wfx.nAvgBytesPerSec / 2; - - GST_INFO_OBJECT (dsoundsink, - "GstRingBufferSpec->channels: %d, GstRingBufferSpec->rate: %d, GstRingBufferSpec->bytes_per_sample: %d\n" - "WAVEFORMATEX.nSamplesPerSec: %ld, WAVEFORMATEX.wBitsPerSample: %d, WAVEFORMATEX.nBlockAlign: %d, WAVEFORMATEX.nAvgBytesPerSec: %ld\n" - "Size of dsound cirucular buffe=>%d\n", spec->channels, spec->rate, - spec->bytes_per_sample, wfx.nSamplesPerSec, wfx.wBitsPerSample, - wfx.nBlockAlign, wfx.nAvgBytesPerSec, dsoundsink->buffer_size); - - /* create a secondary directsound buffer */ - memset (&descSecondary, 0, sizeof (DSBUFFERDESC)); - descSecondary.dwSize = sizeof (DSBUFFERDESC); - descSecondary.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | - DSBCAPS_GLOBALFOCUS | DSBCAPS_CTRLVOLUME; - - descSecondary.dwBufferBytes = dsoundsink->buffer_size; - descSecondary.lpwfxFormat = (WAVEFORMATEX *) & wfx; - - hRes = IDirectSound_CreateSoundBuffer (dsoundsink->pDS, &descSecondary, - &dsoundsink->pDSBSecondary, NULL); - if (FAILED (hRes)) { - GST_ELEMENT_ERROR (dsoundsink, RESOURCE, OPEN_READ, - ("gst_directsound_sink_prepare: IDirectSound_CreateSoundBuffer: %s", - DXGetErrorString9 (hRes)), (NULL)); - return FALSE; - } - - return TRUE; -} - -static gboolean -gst_directsound_sink_unprepare (GstAudioSink * asink) -{ - GstDirectSoundSink *dsoundsink; - - dsoundsink = GST_DIRECTSOUND_SINK (asink); - - /* release secondary DirectSound buffer */ - if (dsoundsink->pDSBSecondary) - IDirectSoundBuffer_Release (dsoundsink->pDSBSecondary); - - return TRUE; -} - -static gboolean -gst_directsound_sink_close (GstAudioSink * asink) -{ - GstDirectSoundSink *dsoundsink = NULL; - - dsoundsink = GST_DIRECTSOUND_SINK (asink); - - /* release DirectSound object */ - g_return_val_if_fail (dsoundsink->pDS != NULL, FALSE); - IDirectSound_Release (dsoundsink->pDS); - - return TRUE; -} - -static guint -gst_directsound_sink_write (GstAudioSink * asink, gpointer data, guint length) -{ - GstDirectSoundSink *dsoundsink; - DWORD dwStatus; - HRESULT hRes; - LPVOID pLockedBuffer1 = NULL, pLockedBuffer2 = NULL; - DWORD dwSizeBuffer1, dwSizeBuffer2; - DWORD dwCurrentPlayCursor; - - dsoundsink = GST_DIRECTSOUND_SINK (asink); - - GST_DSOUND_LOCK (dsoundsink); - - /* get current buffer status */ - hRes = IDirectSoundBuffer_GetStatus (dsoundsink->pDSBSecondary, &dwStatus); - - /* get current play cursor position */ - hRes = IDirectSoundBuffer_GetCurrentPosition (dsoundsink->pDSBSecondary, - &dwCurrentPlayCursor, NULL); - - if (SUCCEEDED (hRes) && (dwStatus & DSBSTATUS_PLAYING)) { - DWORD dwFreeBufferSize; - - calculate_freesize: - /* calculate the free size of the circular buffer */ - if (dwCurrentPlayCursor < dsoundsink->current_circular_offset) - dwFreeBufferSize = - dsoundsink->buffer_size - (dsoundsink->current_circular_offset - - dwCurrentPlayCursor); - else - dwFreeBufferSize = - dwCurrentPlayCursor - dsoundsink->current_circular_offset; - - if (length >= dwFreeBufferSize) { - Sleep (100); - hRes = IDirectSoundBuffer_GetCurrentPosition (dsoundsink->pDSBSecondary, - &dwCurrentPlayCursor, NULL); - - hRes = - IDirectSoundBuffer_GetStatus (dsoundsink->pDSBSecondary, &dwStatus); - if (SUCCEEDED (hRes) && (dwStatus & DSBSTATUS_PLAYING)) - goto calculate_freesize; - else { - dsoundsink->first_buffer_after_reset = FALSE; - GST_DSOUND_UNLOCK (dsoundsink); - return 0; - } - } - } - - if (dwStatus & DSBSTATUS_BUFFERLOST) { - hRes = IDirectSoundBuffer_Restore (dsoundsink->pDSBSecondary); /*need a loop waiting the buffer is restored?? */ - - dsoundsink->current_circular_offset = 0; - } - - hRes = IDirectSoundBuffer_Lock (dsoundsink->pDSBSecondary, - dsoundsink->current_circular_offset, length, &pLockedBuffer1, - &dwSizeBuffer1, &pLockedBuffer2, &dwSizeBuffer2, 0L); - - if (SUCCEEDED (hRes)) { - // Write to pointers without reordering. - memcpy (pLockedBuffer1, data, dwSizeBuffer1); - if (pLockedBuffer2 != NULL) - memcpy (pLockedBuffer2, (LPBYTE) data + dwSizeBuffer1, dwSizeBuffer2); - - // Update where the buffer will lock (for next time) - dsoundsink->current_circular_offset += dwSizeBuffer1 + dwSizeBuffer2; - dsoundsink->current_circular_offset %= dsoundsink->buffer_size; /* Circular buffer */ - - hRes = IDirectSoundBuffer_Unlock (dsoundsink->pDSBSecondary, pLockedBuffer1, - dwSizeBuffer1, pLockedBuffer2, dwSizeBuffer2); - } - - /* if the buffer was not in playing state yet, call play on the buffer - except if this buffer is the fist after a reset (base class call reset and write a buffer when setting the sink to pause) */ - if (!(dwStatus & DSBSTATUS_PLAYING) && - dsoundsink->first_buffer_after_reset == FALSE) { - hRes = IDirectSoundBuffer_Play (dsoundsink->pDSBSecondary, 0, 0, - DSBPLAY_LOOPING); - } - - dsoundsink->first_buffer_after_reset = FALSE; - - GST_DSOUND_UNLOCK (dsoundsink); - - return length; -} - -static guint -gst_directsound_sink_delay (GstAudioSink * asink) -{ - GstDirectSoundSink *dsoundsink; - HRESULT hRes; - DWORD dwCurrentPlayCursor; - DWORD dwBytesInQueue = 0; - gint nNbSamplesInQueue = 0; - DWORD dwStatus; - - dsoundsink = GST_DIRECTSOUND_SINK (asink); - - /* get current buffer status */ - hRes = IDirectSoundBuffer_GetStatus (dsoundsink->pDSBSecondary, &dwStatus); - - if (dwStatus & DSBSTATUS_PLAYING) { - /*evaluate the number of samples in queue in the circular buffer */ - hRes = IDirectSoundBuffer_GetCurrentPosition (dsoundsink->pDSBSecondary, - &dwCurrentPlayCursor, NULL); - - if (hRes == S_OK) { - if (dwCurrentPlayCursor < dsoundsink->current_circular_offset) - dwBytesInQueue = - dsoundsink->current_circular_offset - dwCurrentPlayCursor; - else - dwBytesInQueue = - dsoundsink->current_circular_offset + (dsoundsink->buffer_size - - dwCurrentPlayCursor); - - nNbSamplesInQueue = dwBytesInQueue / dsoundsink->bytes_per_sample; - } - } - - return nNbSamplesInQueue; -} - -static void -gst_directsound_sink_reset (GstAudioSink * asink) -{ - GstDirectSoundSink *dsoundsink; - LPVOID pLockedBuffer = NULL; - DWORD dwSizeBuffer = 0; - - dsoundsink = GST_DIRECTSOUND_SINK (asink); - - GST_DSOUND_LOCK (dsoundsink); - - if (dsoundsink->pDSBSecondary) { - /*stop playing */ - HRESULT hRes = IDirectSoundBuffer_Stop (dsoundsink->pDSBSecondary); - - /*reset position */ - hRes = IDirectSoundBuffer_SetCurrentPosition (dsoundsink->pDSBSecondary, 0); - dsoundsink->current_circular_offset = 0; - - /*reset the buffer */ - hRes = IDirectSoundBuffer_Lock (dsoundsink->pDSBSecondary, - dsoundsink->current_circular_offset, dsoundsink->buffer_size, - &pLockedBuffer, &dwSizeBuffer, NULL, NULL, 0L); - - if (SUCCEEDED (hRes)) { - memset (pLockedBuffer, 0, dwSizeBuffer); - - hRes = - IDirectSoundBuffer_Unlock (dsoundsink->pDSBSecondary, pLockedBuffer, - dwSizeBuffer, NULL, 0); - } - } - - dsoundsink->first_buffer_after_reset = TRUE; - - GST_DSOUND_UNLOCK (dsoundsink); -} diff --git a/sys/directsound/gstdirectsoundsink.h b/sys/directsound/gstdirectsoundsink.h deleted file mode 100644 index 6acf92b4c..000000000 --- a/sys/directsound/gstdirectsoundsink.h +++ /dev/null @@ -1,89 +0,0 @@ -/* GStreamer - * Copyright (C) 2005 Sebastien Moutte <sebastien@moutte.net> - * Copyright (C) 2007 Pioneers of the Inevitable <songbird@songbirdnest.com> - * - * gstdirectsoundsink.h: - * - * 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 - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * The development of this code was made possible due to the involvement - * of Pioneers of the Inevitable, the creators of the Songbird Music player - * - * - */ - -#ifndef __GST_DIRECTSOUNDSINK_H__ -#define __GST_DIRECTSOUNDSINK_H__ - -#include <gst/gst.h> -#include <gst/audio/gstaudiosink.h> -#include <gst/interfaces/mixer.h> - -#include <windows.h> -#include <dxerr9.h> -#include <dsound.h> - -G_BEGIN_DECLS -#define GST_TYPE_DIRECTSOUND_SINK (gst_directsound_sink_get_type()) -#define GST_DIRECTSOUND_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DIRECTSOUND_SINK,GstDirectSoundSink)) -#define GST_DIRECTSOUND_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DIRECTSOUND_SINK,GstDirectSoundSinkClass)) -#define GST_IS_DIRECTSOUND_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DIRECTSOUND_SINK)) -#define GST_IS_DIRECTSOUND_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DIRECTSOUND_SINK)) -typedef struct _GstDirectSoundSink GstDirectSoundSink; -typedef struct _GstDirectSoundSinkClass GstDirectSoundSinkClass; - -#define GST_DSOUND_LOCK(obj) (g_mutex_lock (obj->dsound_lock)) -#define GST_DSOUND_UNLOCK(obj) (g_mutex_unlock (obj->dsound_lock)) - -struct _GstDirectSoundSink -{ - GstAudioSink sink; - - /* directsound object interface pointer */ - LPDIRECTSOUND pDS; - - /* directsound sound object interface pointer */ - LPDIRECTSOUNDBUFFER pDSBSecondary; - - /* directSound buffer size */ - guint buffer_size; - - /* offset of the circular buffer where we must write next */ - guint current_circular_offset; - - guint bytes_per_sample; - - /* current volume setup by mixer interface */ - glong volume; - - /* tracks list of our mixer interface implementation */ - GList *tracks; - - /* lock used to protect writes and resets */ - GMutex *dsound_lock; - - gboolean first_buffer_after_reset; -}; - -struct _GstDirectSoundSinkClass -{ - GstAudioSinkClass parent_class; -}; - -GType gst_directsound_sink_get_type (void); - -G_END_DECLS -#endif /* __GST_DIRECTSOUNDSINK_H__ */ |