From 0be28ab067fed4e7cf2c3e13d5f99160169338ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sat, 9 May 2009 20:04:43 +0200 Subject: [PATCH] Add bindings for GstMixer and related types --- gstreamer-sharp/Gstreamer.metadata | 13 +- gstreamer-sharp/Makefile.am | 8 +- gstreamer-sharp/MixerMessage.cs | 81 +++++ gstreamer-sharp/MixerTrack.custom | 45 +++ gstreamer-sharp/glue/Makefile.am | 3 +- gstreamer-sharp/glue/mixertrack.c | 28 ++ gstreamer-sharp/override/Mixer.cs | 44 +++ gstreamer-sharp/override/MixerAdapter.cs | 413 +++++++++++++++++++++++ 8 files changed, 631 insertions(+), 4 deletions(-) create mode 100644 gstreamer-sharp/MixerMessage.cs create mode 100644 gstreamer-sharp/MixerTrack.custom create mode 100644 gstreamer-sharp/glue/mixertrack.c create mode 100644 gstreamer-sharp/override/Mixer.cs create mode 100644 gstreamer-sharp/override/MixerAdapter.cs diff --git a/gstreamer-sharp/Gstreamer.metadata b/gstreamer-sharp/Gstreamer.metadata index 4c2c7dfa0c..15e927a3ce 100644 --- a/gstreamer-sharp/Gstreamer.metadata +++ b/gstreamer-sharp/Gstreamer.metadata @@ -1002,6 +1002,8 @@ 1 GstMixerTrack GstMixerTrack + + MixerType @@ -1009,7 +1011,16 @@ MixerMessageType - 1 + MixerTrack + 1 + + MixerOptions + 1 + 1 + gchar* + gchar* + /api/namespace/interface[@cname='GstMixer'] + 1 1 1 diff --git a/gstreamer-sharp/Makefile.am b/gstreamer-sharp/Makefile.am index 4c4174f73b..1c948c57c8 100644 --- a/gstreamer-sharp/Makefile.am +++ b/gstreamer-sharp/Makefile.am @@ -49,13 +49,16 @@ sources = \ PadQueryTypeFunction.cs \ TypeFindDelegates.cs \ PresetDefault.cs \ + MixerMessage.cs \ coreplugins/*.cs \ baseplugins/*.cs overrides = \ override/URIHandlerAdapter.cs \ override/ColorBalanceAdapter.cs \ - override/ColorBalance.cs + override/ColorBalance.cs \ + override/Mixer.cs \ + override/MixerAdapter.cs build_sources = $(addprefix $(srcdir)/, $(sources)) @@ -87,7 +90,8 @@ customs = \ Tag.custom \ TagList.custom \ TypeFind.custom \ - TypeFindFactory.custom + TypeFindFactory.custom \ + MixerTrack.custom build_customs = $(addprefix $(srcdir)/, $(customs)) diff --git a/gstreamer-sharp/MixerMessage.cs b/gstreamer-sharp/MixerMessage.cs new file mode 100644 index 0000000000..e19450d479 --- /dev/null +++ b/gstreamer-sharp/MixerMessage.cs @@ -0,0 +1,81 @@ +namespace Gst.Interfaces { + + using System; + using System.Runtime.InteropServices; + using System.Reflection; + using GLib; + using Gst; + using Gst.Interfaces; + + public static class MixerMessage { + [DllImport("gstreamer-0.10.dll")] + static extern int gst_mixer_message_get_type(IntPtr message); + + public static Gst.Interfaces.MixerMessageType MessageGetType(Gst.Message message) { + int raw_ret = gst_mixer_message_get_type(message == null ? IntPtr.Zero : message.Handle); + Gst.Interfaces.MixerMessageType ret = (Gst.Interfaces.MixerMessageType) raw_ret; + return ret; + } + + [DllImport("gstreamer-0.10.dll")] + static extern void gst_mixer_message_parse_mute_toggled(IntPtr message, out IntPtr track, out bool mute); + + public static void ParseMuteToggled(Gst.Message message, out Gst.Interfaces.MixerTrack track, out bool mute) { + IntPtr native_ptr; + + gst_mixer_message_parse_mute_toggled (message == null ? IntPtr.Zero : message.Handle, out native_ptr, out mute); + + track = (MixerTrack) GLib.Object.GetObject (native_ptr, false); + } + + [DllImport("gstreamer-0.10.dll")] + static extern void gst_mixer_message_parse_option_changed(IntPtr message, out IntPtr options, out IntPtr value); + + public static void MessageParseOptionChanged(Gst.Message message, out Gst.Interfaces.MixerOptions options, out string value) { + IntPtr native_value; + IntPtr native_options; + + gst_mixer_message_parse_option_changed(message == null ? IntPtr.Zero : message.Handle, out native_options, out native_value); + + options = (MixerOptions) GLib.Object.GetObject (native_options, false); + value = GLib.Marshaller.Utf8PtrToString (native_value); + } + + [DllImport("gstreamer-0.10.dll")] + static extern void gst_mixer_message_parse_record_toggled(IntPtr message, out IntPtr track, out bool record); + + public static void MessageParseRecordToggled(Gst.Message message, out Gst.Interfaces.MixerTrack track, out bool record) { + IntPtr native_ptr; + + gst_mixer_message_parse_record_toggled(message == null ? IntPtr.Zero : message.Handle, out native_ptr, out record); + track = (MixerTrack) GLib.Object.GetObject (native_ptr, false); + } + + [DllImport("gstreamer-0.10.dll")] + static extern void gst_mixer_message_parse_volume_changed(IntPtr message, out IntPtr track, out IntPtr volumes, out int num_channels); + + public static void MessageParseVolumeChanged(Gst.Message message, out Gst.Interfaces.MixerTrack track, out int[] volumes) { + IntPtr native_track; + IntPtr native_volumes; + int n_native_volumes; + + gst_mixer_message_parse_volume_changed(message == null ? IntPtr.Zero : message.Handle, out native_track, out native_volumes, out n_native_volumes); + + track = (MixerTrack) GLib.Object.GetObject (native_track, false); + volumes = new int[n_native_volumes]; + for (int i = 0; i < n_native_volumes; i++) + volumes[i] = Marshal.ReadInt32 (native_volumes, i * 4); + GLib.Marshaller.Free (native_volumes); + } + + [DllImport("gstreamer-0.10.dll")] + static extern void gst_mixer_message_parse_options_list_changed(IntPtr message, out IntPtr options); + + public static void MessageParseOptionsListChanged(Gst.Message message, out Gst.Interfaces.MixerOptions options) { + IntPtr native_options; + + gst_mixer_message_parse_options_list_changed(message == null ? IntPtr.Zero : message.Handle, out native_options); + options = (MixerOptions) GLib.Object.GetObject (native_options, false); + } + } +} diff --git a/gstreamer-sharp/MixerTrack.custom b/gstreamer-sharp/MixerTrack.custom new file mode 100644 index 0000000000..28581d9854 --- /dev/null +++ b/gstreamer-sharp/MixerTrack.custom @@ -0,0 +1,45 @@ +[DllImport ("gstreamersharpglue-0.10") ] +extern static uint gst__interfacessharp_gst__interfaces_mixertrack_get_label_offset (); +static uint label_offset = gst__interfacessharp_gst__interfaces_mixertrack_get_label_offset (); +[DllImport ("gstreamersharpglue-0.10") ] +extern static uint gst__interfacessharp_gst__interfaces_mixertrack_get_flags_offset (); +static uint flags_offset = gst__interfacessharp_gst__interfaces_mixertrack_get_flags_offset (); +[DllImport ("gstreamersharpglue-0.10") ] +extern static uint gst__interfacessharp_gst__interfaces_mixertrack_get_num_channels_offset (); +static uint num_channels_offset = gst__interfacessharp_gst__interfaces_mixertrack_get_num_channels_offset (); +[DllImport ("gstreamersharpglue-0.10") ] +extern static uint gst__interfacessharp_gst__interfaces_mixertrack_get_min_volume_offset (); +static uint min_volume_offset = gst__interfacessharp_gst__interfaces_mixertrack_get_min_volume_offset (); +[DllImport ("gstreamersharpglue-0.10") ] +extern static uint gst__interfacessharp_gst__interfaces_mixertrack_get_max_volume_offset (); +static uint max_volume_offset = gst__interfacessharp_gst__interfaces_mixertrack_get_max_volume_offset (); + +public MixerTrack (uint index, string untranslated_label, string label, MixerTrackFlags flags, int num_channels, int min_volume, int max_volume) : base (IntPtr.Zero) { + CreateNativeObject (new string [] {"index", "untranslated-label"}, new GLib.Value [] { new GLib.Value (index), new GLib.Value (untranslated_label) }); + + unsafe { + IntPtr* raw_ptr = (IntPtr*) ( ( (byte*) Handle) + label_offset); + *raw_ptr = GLib.Marshaller.StringToPtrGStrdup (label); + } + + unsafe { + int* raw_ptr = (int*) ( ( (byte*) Handle) + flags_offset); + *raw_ptr = (int) flags; + } + + unsafe { + int* raw_ptr = (int*) ( ( (byte*) Handle) + num_channels_offset); + *raw_ptr = num_channels; + } + + unsafe { + int* raw_ptr = (int*) ( ( (byte*) Handle) + min_volume_offset); + *raw_ptr = min_volume; + } + + unsafe { + int* raw_ptr = (int*) ( ( (byte*) Handle) + max_volume_offset); + *raw_ptr = max_volume; + } + +} diff --git a/gstreamer-sharp/glue/Makefile.am b/gstreamer-sharp/glue/Makefile.am index 98f3371055..98fe6cd239 100644 --- a/gstreamer-sharp/glue/Makefile.am +++ b/gstreamer-sharp/glue/Makefile.am @@ -15,7 +15,8 @@ libgstreamersharpglue_0_10_la_SOURCES = \ gobject.c \ typefind.c \ indexentry.c \ - indexfactory.c + indexfactory.c \ + mixertrack.c nodist_libgstreamersharpglue_0_10_la_SOURCES = generated.c diff --git a/gstreamer-sharp/glue/mixertrack.c b/gstreamer-sharp/glue/mixertrack.c new file mode 100644 index 0000000000..787ed8bb23 --- /dev/null +++ b/gstreamer-sharp/glue/mixertrack.c @@ -0,0 +1,28 @@ +#include +#include + +uint +gst__interfacessharp_gst__interfaces_mixertrack_get_label_offset (void) { + return (uint) G_STRUCT_OFFSET (GstMixerTrack, label); +} + +uint +gst__interfacessharp_gst__interfaces_mixertrack_get_flags_offset (void) { + return (uint) G_STRUCT_OFFSET (GstMixerTrack, flags); +} + +uint +gst__interfacessharp_gst__interfaces_mixertrack_get_num_channels_offset (void) { + return (uint) G_STRUCT_OFFSET (GstMixerTrack, num_channels); +} + +uint +gst__interfacessharp_gst__interfaces_mixertrack_get_min_volume_offset (void) { + return (uint) G_STRUCT_OFFSET (GstMixerTrack, min_volume); +} + +uint +gst__interfacessharp_gst__interfaces_mixertrack_get_max_volume_offset (void) { + return (uint) G_STRUCT_OFFSET (GstMixerTrack, max_volume); +} + diff --git a/gstreamer-sharp/override/Mixer.cs b/gstreamer-sharp/override/Mixer.cs new file mode 100644 index 0000000000..b807043f66 --- /dev/null +++ b/gstreamer-sharp/override/Mixer.cs @@ -0,0 +1,44 @@ +// This file was generated by the Gtk# code generator. +// Changed to include the MixerType property + +namespace Gst.Interfaces { + + using System; + +#region Autogenerated code + public interface Mixer : GLib.IWrapper { + Gst.Interfaces.MixerType MixerType { + get; + } + void VolumeChanged(Gst.Interfaces.MixerTrack track, int[] volumes); + Gst.Interfaces.MixerTrack[] ListTracks(); + void SetOption(Gst.Interfaces.MixerOptions opts, string value); + void SetVolume(Gst.Interfaces.MixerTrack track, int[] volumes); + void MuteToggled(Gst.Interfaces.MixerTrack track, bool mute); + void OptionChanged(Gst.Interfaces.MixerOptions opts, string value); + void OptionsListChanged(Gst.Interfaces.MixerOptions opts); + string GetOption(Gst.Interfaces.MixerOptions opts); + void SetRecord(Gst.Interfaces.MixerTrack track, bool record); + void RecordToggled(Gst.Interfaces.MixerTrack track, bool record); + int[] GetVolume(Gst.Interfaces.MixerTrack track); + Gst.Interfaces.MixerFlags MixerFlags { + get; + } + void MixerChanged(); + void SetMute(Gst.Interfaces.MixerTrack track, bool mute); + } + + [GLib.GInterface (typeof (MixerAdapter))] + public interface MixerImplementor : GLib.IWrapper { + + Gst.Interfaces.MixerTrack[] ListTracks (); + void SetVolume (Gst.Interfaces.MixerTrack track, int[] volumes); + int[] GetVolume (Gst.Interfaces.MixerTrack track); + void SetMute (Gst.Interfaces.MixerTrack track, bool mute); + void SetRecord (Gst.Interfaces.MixerTrack track, bool record); + void SetOption (Gst.Interfaces.MixerOptions opts, string value); + string GetOption (Gst.Interfaces.MixerOptions opts); + Gst.Interfaces.MixerFlags MixerFlags { get; } + } +#endregion +} diff --git a/gstreamer-sharp/override/MixerAdapter.cs b/gstreamer-sharp/override/MixerAdapter.cs new file mode 100644 index 0000000000..d873dd70cf --- /dev/null +++ b/gstreamer-sharp/override/MixerAdapter.cs @@ -0,0 +1,413 @@ +// This file was generated by the Gtk# code generator. +// Any changes made will be lost if regenerated. + +namespace Gst.Interfaces { + + using System; + using System.Runtime.InteropServices; + using System.Reflection; + +#region Autogenerated code + public class MixerAdapter : GLib.GInterfaceAdapter, Gst.Interfaces.Mixer { + + [StructLayout (LayoutKind.Sequential)] + struct GstMixerClass { + public Gst.Interfaces.MixerType MixerType; + public ListTracksNativeDelegate ListTracks; + public SetVolumeNativeDelegate SetVolume; + public GetVolumeNativeDelegate GetVolume; + public SetMuteNativeDelegate SetMute; + public SetRecordNativeDelegate SetRecord; + IntPtr MuteToggled; + IntPtr RecordToggled; + IntPtr VolumeChanged; + public SetOptionNativeDelegate SetOption; + public GetOptionNativeDelegate GetOption; + IntPtr OptionChanged; + public GetMixerFlagsNativeDelegate GetMixerFlags; + [MarshalAs (UnmanagedType.ByValArray, SizeConst=3)] + public IntPtr[] GstReserved; + } + + static GstMixerClass iface; + + static MixerAdapter () + { + GLib.GType.Register (_gtype, typeof(MixerAdapter)); + iface.ListTracks = new ListTracksNativeDelegate (ListTracks_cb); + iface.SetVolume = new SetVolumeNativeDelegate (SetVolume_cb); + iface.GetVolume = new GetVolumeNativeDelegate (GetVolume_cb); + iface.SetMute = new SetMuteNativeDelegate (SetMute_cb); + iface.SetRecord = new SetRecordNativeDelegate (SetRecord_cb); + iface.SetOption = new SetOptionNativeDelegate (SetOption_cb); + iface.GetOption = new GetOptionNativeDelegate (GetOption_cb); + iface.GetMixerFlags = new GetMixerFlagsNativeDelegate (GetMixerFlags_cb); + } + + [GLib.CDeclCallback] + delegate IntPtr ListTracksNativeDelegate (IntPtr inst); + + static IntPtr ListTracks_cb (IntPtr inst) + { + try { + MixerImplementor __obj = GLib.Object.GetObject (inst, false) as MixerImplementor; + Gst.Interfaces.MixerTrack[] __result = __obj.ListTracks (); + GLib.List ret = new GLib.List(__result, typeof (Gst.Interfaces.MixerTrack), false, false); + if (ret == null) + return IntPtr.Zero; + return ret.Handle; + } catch (Exception e) { + GLib.ExceptionManager.RaiseUnhandledException (e, true); + // NOTREACHED: above call does not return. + throw e; + } + } + + [GLib.CDeclCallback] + delegate void SetVolumeNativeDelegate (IntPtr inst, IntPtr track, IntPtr volumes); + + static void SetVolume_cb (IntPtr inst, IntPtr track, IntPtr volumes) + { + try { + MixerImplementor __obj = GLib.Object.GetObject (inst, false) as MixerImplementor; + MixerTrack managed_track = GLib.Object.GetObject (track) as MixerTrack; + int[] managed_volumes = new int[managed_track.NumChannels]; + Marshal.Copy (volumes, managed_volumes, 0, managed_track.NumChannels); + __obj.SetVolume (managed_track, managed_volumes); + } catch (Exception e) { + GLib.ExceptionManager.RaiseUnhandledException (e, true); + // NOTREACHED: above call does not return. + throw e; + } + } + + [GLib.CDeclCallback] + delegate void GetVolumeNativeDelegate (IntPtr inst, IntPtr track, out IntPtr volumes); + + static void GetVolume_cb (IntPtr inst, IntPtr track, out IntPtr volumes) + { + try { + MixerImplementor __obj = GLib.Object.GetObject (inst, false) as MixerImplementor; + MixerTrack managed_track = GLib.Object.GetObject (track) as MixerTrack; + + int[] managed_volumes = __obj.GetVolume (managed_track); + + volumes = GLib.Marshaller.Malloc ((ulong) (4 * managed_track.NumChannels)); + Marshal.Copy (managed_volumes, 0, volumes, managed_track.NumChannels); + } catch (Exception e) { + GLib.ExceptionManager.RaiseUnhandledException (e, true); + // NOTREACHED: above call does not return. + throw e; + } + } + + [GLib.CDeclCallback] + delegate void SetMuteNativeDelegate (IntPtr inst, IntPtr track, bool mute); + + static void SetMute_cb (IntPtr inst, IntPtr track, bool mute) + { + try { + MixerImplementor __obj = GLib.Object.GetObject (inst, false) as MixerImplementor; + __obj.SetMute (GLib.Object.GetObject(track) as Gst.Interfaces.MixerTrack, mute); + } catch (Exception e) { + GLib.ExceptionManager.RaiseUnhandledException (e, false); + } + } + + [GLib.CDeclCallback] + delegate void SetRecordNativeDelegate (IntPtr inst, IntPtr track, bool record); + + static void SetRecord_cb (IntPtr inst, IntPtr track, bool record) + { + try { + MixerImplementor __obj = GLib.Object.GetObject (inst, false) as MixerImplementor; + __obj.SetRecord (GLib.Object.GetObject(track) as Gst.Interfaces.MixerTrack, record); + } catch (Exception e) { + GLib.ExceptionManager.RaiseUnhandledException (e, false); + } + } + + [GLib.CDeclCallback] + delegate void SetOptionNativeDelegate (IntPtr inst, IntPtr opts, IntPtr value); + + static void SetOption_cb (IntPtr inst, IntPtr opts, IntPtr value) + { + try { + MixerImplementor __obj = GLib.Object.GetObject (inst, false) as MixerImplementor; + __obj.SetOption (GLib.Object.GetObject(opts) as Gst.Interfaces.MixerOptions, GLib.Marshaller.PtrToStringGFree(value)); + } catch (Exception e) { + GLib.ExceptionManager.RaiseUnhandledException (e, false); + } + } + + [GLib.CDeclCallback] + delegate IntPtr GetOptionNativeDelegate (IntPtr inst, IntPtr opts); + + static IntPtr GetOption_cb (IntPtr inst, IntPtr opts) + { + try { + MixerImplementor __obj = GLib.Object.GetObject (inst, false) as MixerImplementor; + string __result = __obj.GetOption (GLib.Object.GetObject(opts) as Gst.Interfaces.MixerOptions); + return GLib.Marshaller.StringToPtrGStrdup(__result); + } catch (Exception e) { + GLib.ExceptionManager.RaiseUnhandledException (e, true); + // NOTREACHED: above call does not return. + throw e; + } + } + + [GLib.CDeclCallback] + delegate int GetMixerFlagsNativeDelegate (IntPtr inst); + + static int GetMixerFlags_cb (IntPtr inst) + { + try { + MixerImplementor __obj = GLib.Object.GetObject (inst, false) as MixerImplementor; + Gst.Interfaces.MixerFlags __result = __obj.MixerFlags; + return (int) __result; + } catch (Exception e) { + GLib.ExceptionManager.RaiseUnhandledException (e, true); + // NOTREACHED: above call does not return. + throw e; + } + } + + static int class_offset = 2 * IntPtr.Size; + + static void Initialize (IntPtr ptr, IntPtr data) + { + IntPtr ifaceptr = new IntPtr (ptr.ToInt64 () + class_offset); + GstMixerClass native_iface = (GstMixerClass) Marshal.PtrToStructure (ifaceptr, typeof (GstMixerClass)); + native_iface.ListTracks = iface.ListTracks; + native_iface.SetVolume = iface.SetVolume; + native_iface.GetVolume = iface.GetVolume; + native_iface.SetMute = iface.SetMute; + native_iface.SetRecord = iface.SetRecord; + native_iface.SetOption = iface.SetOption; + native_iface.GetOption = iface.GetOption; + native_iface.GetMixerFlags = iface.GetMixerFlags; + + GCHandle gch = (GCHandle) data; + MixerAdapter adapter = gch.Target as MixerAdapter; + PropertyInfo pi = adapter.Type.GetProperty ("MixerType", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.FlattenHierarchy); + if (pi != null && pi.PropertyType == typeof (Gst.Interfaces.MixerType)) + native_iface.MixerType = (Gst.Interfaces.MixerType) pi.GetValue (null, null); + + Marshal.StructureToPtr (native_iface, ifaceptr, false); + gch.Free (); + } + + public MixerAdapter () + { + InitHandler = new GLib.GInterfaceInitHandler (Initialize); + } + + MixerImplementor implementor; + + public MixerAdapter (MixerImplementor implementor) + { + if (implementor == null) + throw new ArgumentNullException ("implementor"); + this.implementor = implementor; + } + + public MixerAdapter (IntPtr handle) + { + if (!_gtype.IsInstance (handle)) + throw new ArgumentException ("The gobject doesn't implement the GInterface of this adapter", "handle"); + this.handle = handle; + } + + [DllImport("gstreamer-0.10.dll")] + static extern IntPtr gst_mixer_get_type(); + + private static GLib.GType _gtype = new GLib.GType (gst_mixer_get_type ()); + + public override GLib.GType GType { + get { + return _gtype; + } + } + + IntPtr handle; + public override IntPtr Handle { + get { + if (handle != IntPtr.Zero) + return handle; + return implementor == null ? IntPtr.Zero : implementor.Handle; + } + } + + public static Mixer GetObject (IntPtr handle, bool owned) + { + GLib.Object obj = GLib.Object.GetObject (handle, owned); + return GetObject (obj); + } + + public static Mixer GetObject (GLib.Object obj) + { + if (obj == null) + return null; + else if (obj is MixerImplementor) + return new MixerAdapter (obj as MixerImplementor); + else if (obj as Mixer == null) + return new MixerAdapter (obj.Handle); + else + return obj as Mixer; + } + + public MixerImplementor Implementor { + get { + return implementor; + } + } + + [DllImport("gstreamer-0.10.dll")] + static extern void gst_mixer_volume_changed(IntPtr raw, IntPtr track, IntPtr volumes); + + public void VolumeChanged(Gst.Interfaces.MixerTrack track, int[] volumes) { + if (track == null) + return; + + if (volumes.Length != track.NumChannels) + throw new ArgumentOutOfRangeException (); + + IntPtr native_volumes = GLib.Marshaller.Malloc ((ulong) (4 * track.NumChannels)); + Marshal.Copy (volumes, 0, native_volumes, track.NumChannels); + gst_mixer_volume_changed(Handle, track.Handle, native_volumes); + GLib.Marshaller.Free (native_volumes); + } + + [DllImport("gstreamer-0.10.dll")] + static extern IntPtr gst_mixer_list_tracks(IntPtr raw); + + public Gst.Interfaces.MixerTrack[] ListTracks() { + IntPtr raw_ret = gst_mixer_list_tracks(Handle); + Gst.Interfaces.MixerTrack[] ret = (Gst.Interfaces.MixerTrack[]) GLib.Marshaller.ListPtrToArray (raw_ret, typeof(GLib.List), false, false, typeof(Gst.Interfaces.MixerTrack)); + return ret; + } + + [DllImport("gstreamer-0.10.dll")] + static extern void gst_mixer_set_option(IntPtr raw, IntPtr opts, IntPtr value); + + public void SetOption(Gst.Interfaces.MixerOptions opts, string value) { + gst_mixer_set_option(Handle, opts == null ? IntPtr.Zero : opts.Handle, GLib.Marshaller.StringToPtrGStrdup(value)); + } + + [DllImport("gstreamer-0.10.dll")] + static extern void gst_mixer_set_volume(IntPtr raw, IntPtr track, IntPtr volumes); + + public void SetVolume(Gst.Interfaces.MixerTrack track, int[] volumes) { + if (track == null) + return; + + if (volumes.Length != track.NumChannels) + throw new ArgumentOutOfRangeException (); + + IntPtr volumes_native = GLib.Marshaller.Malloc ((ulong) (4 * track.NumChannels)); + Marshal.Copy (volumes, 0, volumes_native, track.NumChannels); + + gst_mixer_set_volume(Handle, track.Handle, volumes_native); + GLib.Marshaller.Free (volumes_native); + } + + [DllImport("gstreamer-0.10.dll")] + static extern void gst_mixer_mute_toggled(IntPtr raw, IntPtr track, bool mute); + + public void MuteToggled(Gst.Interfaces.MixerTrack track, bool mute) { + gst_mixer_mute_toggled(Handle, track == null ? IntPtr.Zero : track.Handle, mute); + } + + [DllImport("gstreamer-0.10.dll")] + static extern void gst_mixer_option_changed(IntPtr raw, IntPtr opts, IntPtr value); + + public void OptionChanged(Gst.Interfaces.MixerOptions opts, string value) { + gst_mixer_option_changed(Handle, opts == null ? IntPtr.Zero : opts.Handle, GLib.Marshaller.StringToPtrGStrdup(value)); + } + + [DllImport("gstreamer-0.10.dll")] + static extern void gst_mixer_options_list_changed(IntPtr raw, IntPtr opts); + + public void OptionsListChanged(Gst.Interfaces.MixerOptions opts) { + gst_mixer_options_list_changed(Handle, opts == null ? IntPtr.Zero : opts.Handle); + } + + [DllImport("gstreamer-0.10.dll")] + static extern IntPtr gst_mixer_get_option(IntPtr raw, IntPtr opts); + + public string GetOption(Gst.Interfaces.MixerOptions opts) { + IntPtr raw_ret = gst_mixer_get_option(Handle, opts == null ? IntPtr.Zero : opts.Handle); + string ret = GLib.Marshaller.Utf8PtrToString (raw_ret); + return ret; + } + + [DllImport("gstreamer-0.10.dll")] + static extern void gst_mixer_set_record(IntPtr raw, IntPtr track, bool record); + + public void SetRecord(Gst.Interfaces.MixerTrack track, bool record) { + gst_mixer_set_record(Handle, track == null ? IntPtr.Zero : track.Handle, record); + } + + [DllImport("gstreamer-0.10.dll")] + static extern void gst_mixer_record_toggled(IntPtr raw, IntPtr track, bool record); + + public void RecordToggled(Gst.Interfaces.MixerTrack track, bool record) { + gst_mixer_record_toggled(Handle, track == null ? IntPtr.Zero : track.Handle, record); + } + + [DllImport("gstreamer-0.10.dll")] + static extern void gst_mixer_get_volume(IntPtr raw, IntPtr track, ref IntPtr volumes); + + public int[] GetVolume(Gst.Interfaces.MixerTrack track) { + if (track == null) + return null; + + IntPtr native_volumes = GLib.Marshaller.Malloc ((ulong) (4 * track.NumChannels)); + gst_mixer_get_volume(Handle, track.Handle, ref native_volumes); + + int[] volumes = new int[track.NumChannels]; + Marshal.Copy (native_volumes, volumes, 0, track.NumChannels); + GLib.Marshaller.Free (native_volumes); + return volumes; + } + + [DllImport("gstreamer-0.10.dll")] + static extern int gst_mixer_get_mixer_flags(IntPtr raw); + + public Gst.Interfaces.MixerFlags MixerFlags { + get { + int raw_ret = gst_mixer_get_mixer_flags(Handle); + Gst.Interfaces.MixerFlags ret = (Gst.Interfaces.MixerFlags) raw_ret; + return ret; + } + } + + [DllImport("gstreamer-0.10.dll")] + static extern void gst_mixer_mixer_changed(IntPtr raw); + + public void MixerChanged() { + gst_mixer_mixer_changed(Handle); + } + + [DllImport("gstreamer-0.10.dll")] + static extern void gst_mixer_set_mute(IntPtr raw, IntPtr track, bool mute); + + public void SetMute(Gst.Interfaces.MixerTrack track, bool mute) { + gst_mixer_set_mute(Handle, track == null ? IntPtr.Zero : track.Handle, mute); + } + + [DllImport("libgobject-2.0-0.dll")] + static extern IntPtr g_type_interface_peek (IntPtr klass, IntPtr iface_gtype); + public Gst.Interfaces.MixerType MixerType { + get { + IntPtr gclass = Marshal.ReadIntPtr (Handle); + IntPtr ifaceptr = g_type_interface_peek (gclass, _gtype.Val); + GstMixerClass native_iface = (GstMixerClass) Marshal.PtrToStructure (ifaceptr, typeof (GstMixerClass)); + + return native_iface.MixerType; + } + } + +#endregion + } +}