diff options
author | Jan Schmidt <thaytan@mad.scientist.com> | 2007-06-12 18:53:03 +0000 |
---|---|---|
committer | Jan Schmidt <thaytan@mad.scientist.com> | 2007-06-12 18:53:03 +0000 |
commit | 87d6f6575ae7d18f47965d754e3aabe1f7e8ad93 (patch) | |
tree | d3b8b9af58d143359218809fce150f9a84bc0fd0 /sys/waveform/gstwaveformsink.c | |
parent | 6bd7199f3af8001036926261c4c2a22a725bee39 (diff) | |
download | gst-plugins-bad-87d6f6575ae7d18f47965d754e3aabe1f7e8ad93.tar.gz gst-plugins-bad-87d6f6575ae7d18f47965d754e3aabe1f7e8ad93.tar.bz2 gst-plugins-bad-87d6f6575ae7d18f47965d754e3aabe1f7e8ad93.zip |
Remove the waveform plugin now that it is in -good.
Original commit message from CVS:
* docs/plugins/Makefile.am:
* docs/plugins/gst-plugins-bad-plugins-docs.sgml:
* docs/plugins/gst-plugins-bad-plugins-sections.txt:
* docs/plugins/inspect/plugin-waveform.xml:
* sys/waveform/gstwaveformplugin.c:
* sys/waveform/gstwaveformsink.c:
* sys/waveform/gstwaveformsink.h:
* win32/MANIFEST:
* win32/vs6/libgstwaveform.dsp:
Remove the waveform plugin now that it is in -good.
Diffstat (limited to 'sys/waveform/gstwaveformsink.c')
-rw-r--r-- | sys/waveform/gstwaveformsink.c | 601 |
1 files changed, 0 insertions, 601 deletions
diff --git a/sys/waveform/gstwaveformsink.c b/sys/waveform/gstwaveformsink.c deleted file mode 100644 index e709d649..00000000 --- a/sys/waveform/gstwaveformsink.c +++ /dev/null @@ -1,601 +0,0 @@ -/* GStreamer -* Copyright (C) 2005 Sebastien Moutte <sebastien@moutte.net> -* -* gstwaveformsink.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. -*/ - -/** - * SECTION:element-waveformsink - * @short_description: output sound using WaveForm API - * - * <refsect2> - * <para> - * This element lets you output sound using the WaveForm 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 ! waveformsink - * </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 ! waveformsink - * </programlisting> - * will play an Ogg/Vorbis audio file and output it. - * </para> - * </refsect2> - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstwaveformsink.h" - -GST_DEBUG_CATEGORY_STATIC (waveformsink_debug); - -/* elementfactory information */ -static const GstElementDetails gst_waveform_sink_details = -GST_ELEMENT_DETAILS ("WaveForm Audio Sink", - "Sink/Audio", - "Output to a sound card via WaveForm API", - "Sebastien Moutte <sebastien@moutte.net>"); - -static void gst_waveform_sink_base_init (gpointer g_class); -static void gst_waveform_sink_class_init (GstWaveFormSinkClass * klass); -static void gst_waveform_sink_init (GstWaveFormSink * wfsink, - GstWaveFormSinkClass * g_class); -static void gst_waveform_sink_finalise (GObject * object); -static void gst_waveform_sink_set_property (GObject * object, - guint prop_id, const GValue * value, GParamSpec * pspec); -static void gst_waveform_sink_get_property (GObject * object, - guint prop_id, GValue * value, GParamSpec * pspec); -static GstCaps *gst_waveform_sink_getcaps (GstBaseSink * bsink); - -/************************************************************************/ -/* GstAudioSink functions */ -/************************************************************************/ -static gboolean gst_waveform_sink_prepare (GstAudioSink * asink, - GstRingBufferSpec * spec); -static gboolean gst_waveform_sink_unprepare (GstAudioSink * asink); -static gboolean gst_waveform_sink_open (GstAudioSink * asink); -static gboolean gst_waveform_sink_close (GstAudioSink * asink); -static guint gst_waveform_sink_write (GstAudioSink * asink, gpointer data, - guint length); -static guint gst_waveform_sink_delay (GstAudioSink * asink); -static void gst_waveform_sink_reset (GstAudioSink * asink); - -/************************************************************************/ -/* Utils */ -/************************************************************************/ -GstCaps *gst_waveform_sink_create_caps (gint rate, gint channels, - gint bits_per_sample); -WAVEHDR *bufferpool_get_buffer (GstWaveFormSink * wfsink, gpointer data, - guint length); -void CALLBACK waveOutProc (HWAVEOUT hwo, UINT uMsg, unsigned long dwInstance, - DWORD dwParam1, DWORD dwParam2); - -static GstStaticPadTemplate waveformsink_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 (GstWaveFormSink, gst_waveform_sink, GstAudioSink, - GST_TYPE_AUDIO_SINK); - -static void -gst_waveform_sink_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_set_details (element_class, &gst_waveform_sink_details); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&waveformsink_sink_factory)); -} - -static void -gst_waveform_sink_class_init (GstWaveFormSinkClass * 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; - - parent_class = g_type_class_peek_parent (klass); - - gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_waveform_sink_finalise); - gobject_class->get_property = - GST_DEBUG_FUNCPTR (gst_waveform_sink_get_property); - gobject_class->set_property = - GST_DEBUG_FUNCPTR (gst_waveform_sink_set_property); - - gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_waveform_sink_getcaps); - - gstaudiosink_class->prepare = GST_DEBUG_FUNCPTR (gst_waveform_sink_prepare); - gstaudiosink_class->unprepare = - GST_DEBUG_FUNCPTR (gst_waveform_sink_unprepare); - gstaudiosink_class->open = GST_DEBUG_FUNCPTR (gst_waveform_sink_open); - gstaudiosink_class->close = GST_DEBUG_FUNCPTR (gst_waveform_sink_close); - gstaudiosink_class->write = GST_DEBUG_FUNCPTR (gst_waveform_sink_write); - gstaudiosink_class->delay = GST_DEBUG_FUNCPTR (gst_waveform_sink_delay); - gstaudiosink_class->reset = GST_DEBUG_FUNCPTR (gst_waveform_sink_reset); - - GST_DEBUG_CATEGORY_INIT (waveformsink_debug, "waveformsink", 0, - "Waveform sink"); -} - -static void -gst_waveform_sink_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (object); - - switch (prop_id) { - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_waveform_sink_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec) -{ - GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (object); - - switch (prop_id) { - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_waveform_sink_init (GstWaveFormSink * wfsink, - GstWaveFormSinkClass * g_class) -{ - /* initialize members */ - wfsink->hwaveout = NULL; - wfsink->cached_caps = NULL; - wfsink->wave_buffers = NULL; - wfsink->write_buffer = 0; - wfsink->buffer_count = BUFFER_COUNT; - wfsink->buffer_size = BUFFER_SIZE; - wfsink->free_buffers_count = wfsink->buffer_count; - wfsink->bytes_in_queue = 0; - - InitializeCriticalSection (&wfsink->critic_wave); -} - -static void -gst_waveform_sink_finalise (GObject * object) -{ - GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (object); - - if (wfsink->cached_caps) { - gst_caps_unref (wfsink->cached_caps); - wfsink->cached_caps = NULL; - } - - DeleteCriticalSection (&wfsink->critic_wave); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -static GstCaps * -gst_waveform_sink_getcaps (GstBaseSink * bsink) -{ - GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (bsink); - MMRESULT mmresult; - WAVEOUTCAPS wocaps; - GstCaps *caps, *caps_temp; - - /* return the cached caps if already defined */ - if (wfsink->cached_caps) { - return gst_caps_ref (wfsink->cached_caps); - } - - /* get the default device caps */ - mmresult = waveOutGetDevCaps (WAVE_MAPPER, &wocaps, sizeof (wocaps)); - if (mmresult != MMSYSERR_NOERROR) { - waveOutGetErrorText (mmresult, wfsink->error_string, ERROR_LENGTH - 1); - GST_ELEMENT_ERROR (wfsink, RESOURCE, SETTINGS, - ("gst_waveform_sink_getcaps: waveOutGetDevCaps failed error=>%s", - wfsink->error_string), (NULL)); - return NULL; - } - - caps = gst_caps_new_empty (); - - /* create a caps for all wave formats supported by the device - starting by the best quality format */ - if (wocaps.dwFormats & WAVE_FORMAT_96S16) { - caps_temp = gst_waveform_sink_create_caps (96000, 2, 16); - if (caps_temp) { - gst_caps_append (caps, caps_temp); - } - } - if (wocaps.dwFormats & WAVE_FORMAT_96S08) { - caps_temp = gst_waveform_sink_create_caps (96000, 2, 8); - if (caps_temp) { - gst_caps_append (caps, caps_temp); - } - } - if (wocaps.dwFormats & WAVE_FORMAT_96M16) { - caps_temp = gst_waveform_sink_create_caps (96000, 1, 16); - if (caps_temp) { - gst_caps_append (caps, caps_temp); - } - } - if (wocaps.dwFormats & WAVE_FORMAT_96M08) { - caps_temp = gst_waveform_sink_create_caps (96000, 1, 8); - if (caps_temp) { - gst_caps_append (caps, caps_temp); - } - } - if (wocaps.dwFormats & WAVE_FORMAT_4S16) { - caps_temp = gst_waveform_sink_create_caps (44100, 2, 16); - if (caps_temp) { - gst_caps_append (caps, caps_temp); - } - } - if (wocaps.dwFormats & WAVE_FORMAT_4S08) { - caps_temp = gst_waveform_sink_create_caps (44100, 2, 8); - if (caps_temp) { - gst_caps_append (caps, caps_temp); - } - } - if (wocaps.dwFormats & WAVE_FORMAT_4M16) { - caps_temp = gst_waveform_sink_create_caps (44100, 1, 16); - if (caps_temp) { - gst_caps_append (caps, caps_temp); - } - } - if (wocaps.dwFormats & WAVE_FORMAT_4M08) { - caps_temp = gst_waveform_sink_create_caps (44100, 1, 8); - if (caps_temp) { - gst_caps_append (caps, caps_temp); - } - } - if (wocaps.dwFormats & WAVE_FORMAT_2S16) { - caps_temp = gst_waveform_sink_create_caps (22050, 2, 16); - if (caps_temp) { - gst_caps_append (caps, caps_temp); - } - } - if (wocaps.dwFormats & WAVE_FORMAT_2S08) { - caps_temp = gst_waveform_sink_create_caps (22050, 2, 8); - if (caps_temp) { - gst_caps_append (caps, caps_temp); - } - } - if (wocaps.dwFormats & WAVE_FORMAT_2M16) { - caps_temp = gst_waveform_sink_create_caps (22050, 1, 16); - if (caps_temp) { - gst_caps_append (caps, caps_temp); - } - } - if (wocaps.dwFormats & WAVE_FORMAT_2M08) { - caps_temp = gst_waveform_sink_create_caps (22050, 1, 8); - if (caps_temp) { - gst_caps_append (caps, caps_temp); - } - } - if (wocaps.dwFormats & WAVE_FORMAT_1S16) { - caps_temp = gst_waveform_sink_create_caps (11025, 2, 16); - if (caps_temp) { - gst_caps_append (caps, caps_temp); - } - } - if (wocaps.dwFormats & WAVE_FORMAT_1S08) { - caps_temp = gst_waveform_sink_create_caps (11025, 2, 8); - if (caps_temp) { - gst_caps_append (caps, caps_temp); - } - } - if (wocaps.dwFormats & WAVE_FORMAT_1M16) { - caps_temp = gst_waveform_sink_create_caps (11025, 1, 16); - if (caps_temp) { - gst_caps_append (caps, caps_temp); - } - } - if (wocaps.dwFormats & WAVE_FORMAT_1M08) { - caps_temp = gst_waveform_sink_create_caps (11025, 1, 8); - if (caps_temp) { - gst_caps_append (caps, caps_temp); - } - } - - if (gst_caps_is_empty (caps)) { - gst_caps_unref (caps); - caps = NULL; - } else { - wfsink->cached_caps = gst_caps_ref (caps); - } - - GST_CAT_LOG_OBJECT (waveformsink_debug, wfsink, "Returning caps %s", - gst_caps_to_string (caps)); - - return caps; -} - -static gboolean -gst_waveform_sink_open (GstAudioSink * asink) -{ - GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink); - - /* nothing to do here as the device needs to be opened with the format we will use */ - - return TRUE; -} - -static gboolean -gst_waveform_sink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec) -{ - GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink); - WAVEFORMATEX wfx; - MMRESULT mmresult; - guint index; - - /* setup waveformex struture with the input ringbuffer specs */ - memset (&wfx, 0, sizeof (wfx)); - wfx.cbSize = 0; - 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; - - /* save bytes per sample to use it in delay */ - wfsink->bytes_per_sample = spec->bytes_per_sample; - - /* open the default audio device with the given caps */ - mmresult = waveOutOpen (&wfsink->hwaveout, WAVE_MAPPER, - &wfx, (DWORD) waveOutProc, (DWORD) wfsink, CALLBACK_FUNCTION); - if (mmresult != MMSYSERR_NOERROR) { - waveOutGetErrorText (mmresult, wfsink->error_string, ERROR_LENGTH - 1); - GST_ELEMENT_ERROR (wfsink, RESOURCE, OPEN_WRITE, - ("gst_waveform_sink_prepare: waveOutOpen failed error=>%s", - wfsink->error_string), (NULL)); - return FALSE; - } - - /* evaluate the buffer size and the number of buffers needed */ - wfsink->free_buffers_count = wfsink->buffer_count; - - /* allocate wave buffers */ - wfsink->wave_buffers = (WAVEHDR *) g_new0 (WAVEHDR, wfsink->buffer_count); - if (!wfsink->wave_buffers) { - GST_ELEMENT_ERROR (wfsink, RESOURCE, OPEN_WRITE, - ("gst_waveform_sink_prepare: Failed to allocate wave buffer headers (buffer count=%d)", - wfsink->buffer_count), (NULL)); - return FALSE; - } - memset (wfsink->wave_buffers, 0, sizeof (WAVEHDR) * wfsink->buffer_count); - - /* setup headers */ - for (index = 0; index < wfsink->buffer_count; index++) { - wfsink->wave_buffers[index].dwBufferLength = wfsink->buffer_size; - wfsink->wave_buffers[index].lpData = g_new0 (gchar, wfsink->buffer_size); - } - - return TRUE; -} - -static gboolean -gst_waveform_sink_unprepare (GstAudioSink * asink) -{ - GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink); - - /* free wave buffers */ - if (wfsink->wave_buffers) { - guint index; - - for (index = 0; index < wfsink->buffer_count; index++) { - if (wfsink->wave_buffers[index].dwFlags & WHDR_PREPARED) { - MMRESULT mmresult = - waveOutUnprepareHeader (wfsink->hwaveout, - &wfsink->wave_buffers[index], sizeof (WAVEHDR)); - if (mmresult != MMSYSERR_NOERROR) { - waveOutGetErrorText (mmresult, wfsink->error_string, - ERROR_LENGTH - 1); - GST_CAT_WARNING_OBJECT (waveformsink_debug, wfsink, - "gst_waveform_sink_unprepare: Error unpreparing buffer => %s", - wfsink->error_string); - } - } - g_free (wfsink->wave_buffers[index].lpData); - } - g_free (wfsink->wave_buffers); - wfsink->wave_buffers = NULL; - } - - /* close waveform-audio output device */ - if (wfsink->hwaveout) { - waveOutClose (wfsink->hwaveout); - wfsink->hwaveout = NULL; - } - - return TRUE; -} - -static gboolean -gst_waveform_sink_close (GstAudioSink * asink) -{ - GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink); - - return TRUE; -} - -static guint -gst_waveform_sink_write (GstAudioSink * asink, gpointer data, guint length) -{ - GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink); - WAVEHDR *waveheader; - MMRESULT mmresult; - guint bytes_to_write = length; - guint remaining_length = length; - - wfsink->bytes_in_queue += length; - - while (remaining_length > 0) { - if (wfsink->free_buffers_count == 0) { - /* no free buffer available, wait for one */ - Sleep (10); - continue; - } - - /* get the current write buffer header */ - waveheader = &wfsink->wave_buffers[wfsink->write_buffer]; - - /* unprepare the header if needed */ - if (waveheader->dwFlags & WHDR_PREPARED) { - mmresult = - waveOutUnprepareHeader (wfsink->hwaveout, waveheader, - sizeof (WAVEHDR)); - if (mmresult != MMSYSERR_NOERROR) { - waveOutGetErrorText (mmresult, wfsink->error_string, ERROR_LENGTH - 1); - GST_CAT_WARNING_OBJECT (waveformsink_debug, wfsink, - "Error unpreparing buffer => %s", wfsink->error_string); - } - } - - if (wfsink->buffer_size - waveheader->dwUser >= remaining_length) - bytes_to_write = remaining_length; - else - bytes_to_write = wfsink->buffer_size - waveheader->dwUser; - - memcpy (waveheader->lpData + waveheader->dwUser, data, bytes_to_write); - waveheader->dwUser += bytes_to_write; - remaining_length -= bytes_to_write; - data = (byte *) data + bytes_to_write; - - if (waveheader->dwUser == wfsink->buffer_size) { - /* we have filled a buffer, let's prepare it and next write it to the device */ - mmresult = - waveOutPrepareHeader (wfsink->hwaveout, waveheader, sizeof (WAVEHDR)); - if (mmresult != MMSYSERR_NOERROR) { - waveOutGetErrorText (mmresult, wfsink->error_string, ERROR_LENGTH - 1); - GST_CAT_WARNING_OBJECT (waveformsink_debug, wfsink, - "gst_waveform_sink_write: Error preparing header => %s", - wfsink->error_string); - } - mmresult = waveOutWrite (wfsink->hwaveout, waveheader, sizeof (WAVEHDR)); - if (mmresult != MMSYSERR_NOERROR) { - waveOutGetErrorText (mmresult, wfsink->error_string, ERROR_LENGTH - 1); - GST_CAT_WARNING_OBJECT (waveformsink_debug, wfsink, - "gst_waveform_sink_write: Error writting buffer to the device => %s", - wfsink->error_string); - } - - EnterCriticalSection (&wfsink->critic_wave); - wfsink->free_buffers_count--; - LeaveCriticalSection (&wfsink->critic_wave); - - wfsink->write_buffer++; - wfsink->write_buffer %= wfsink->buffer_count; - waveheader->dwUser = 0; - wfsink->bytes_in_queue = 0; - GST_CAT_LOG_OBJECT (waveformsink_debug, wfsink, - "gst_waveform_sink_write: Writting a buffer to the device (free buffers remaining=%d, write buffer=%d)", - wfsink->free_buffers_count, wfsink->write_buffer); - } - } - - return length; -} - -static guint -gst_waveform_sink_delay (GstAudioSink * asink) -{ - /* return the number of samples in queue (device+internal queue) */ - GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink); - guint bytes_in_device = - (wfsink->buffer_count - wfsink->free_buffers_count) * wfsink->buffer_size; - guint delay = - (bytes_in_device + wfsink->bytes_in_queue) / wfsink->bytes_per_sample; - return delay; -} - -static void -gst_waveform_sink_reset (GstAudioSink * asink) -{ - GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink); - MMRESULT mmresult = waveOutReset (wfsink->hwaveout); - - if (mmresult != MMSYSERR_NOERROR) { - waveOutGetErrorText (mmresult, wfsink->error_string, ERROR_LENGTH - 1); - GST_CAT_WARNING_OBJECT (waveformsink_debug, wfsink, - "gst_waveform_sink_reset: Error reseting waveform-audio device => %s", - wfsink->error_string); - } -} - -GstCaps * -gst_waveform_sink_create_caps (gint rate, gint channels, gint bits_per_sample) -{ - GstCaps *caps = NULL; - - caps = gst_caps_new_simple ("audio/x-raw-int", - "width", G_TYPE_INT, bits_per_sample, - "depth", G_TYPE_INT, bits_per_sample, - "endianness", G_TYPE_INT, G_BYTE_ORDER, - "signed", G_TYPE_BOOLEAN, TRUE, - "channels", G_TYPE_INT, channels, "rate", G_TYPE_INT, rate, NULL); - return caps; -} - -void CALLBACK -waveOutProc (HWAVEOUT hwo, - UINT uMsg, unsigned long dwInstance, DWORD dwParam1, DWORD dwParam2) -{ - GstWaveFormSink *wfsink = (GstWaveFormSink *) dwInstance; - - if (uMsg == WOM_DONE) { - EnterCriticalSection (&wfsink->critic_wave); - wfsink->free_buffers_count++; - LeaveCriticalSection (&wfsink->critic_wave); - } -} |