Commit cd6d499b authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont
Browse files

Embryonic CIL bindings for libvlc-control

parent 86af9ad1
CS = gmcs
CSFLAGS =
TARGETS = VideoLAN.VLC.Control.dll testvlc.exe
all: $(TARGETS)
clean:
rm -f -- $(TARGETS) *.netmodule
VideoLAN.VLC.Control.dll: marshal.cs libvlc.cs exception.cs
testvlc.exe: testvlc.cs VideoLAN.VLC.Control.dll
%.netmodule: %.cs Makefile
$(CS) -target:module -out:$@ $(CSFLAGS) $(filter %.cs,$^) \
$(patsubst %,-addmodule:%,$(filter %.netmodule,$^)) \
%.dll: Makefile
$(CS) -target:library -out:$@ $(CSFLAGS) $(filter %.cs,$^) \
$(patsubst %,-addmodule:%,$(filter %.netmodule,$^)) \
$(patsubst %,-r:%,$(filter %.dll,$^))
%.exe: Makefile
$(CS) -target:exe -out:$@ $(CSFLAGS) $(filter %.cs,$^) \
$(patsubst %,-addmodule:%,$(filter %.netmodule,$^)) \
$(patsubst %,-r:%,$(filter %.dll,$^))
/*
* libvlc.cs - libvlc-control CIL bindings
*
* $Id$
*/
/**********************************************************************
* Copyright (C) 2007 Rémi Denis-Courmont. *
* This program is free software; you can redistribute and/or modify *
* it under the terms of the GNU General Public License as published *
* by the Free Software Foundation; version 2 of the license, or (at *
* your option) any later version. *
* *
* This program 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 General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, you can get it from: *
* http://www.gnu.org/copyleft/gpl.html *
**********************************************************************/
using System;
namespace VideoLAN.VLC
{
/**
* Base class for managed LibVLC exceptions
*/
public class MediaException : Exception
{
public MediaException ()
{
}
public MediaException (string message)
: base (message)
{
}
public MediaException (string message, Exception inner)
: base (message, inner)
{
}
};
public class PositionKeyNotSupportedException : MediaException
{
public PositionKeyNotSupportedException ()
{
}
public PositionKeyNotSupportedException (string message)
: base (message)
{
}
public PositionKeyNotSupportedException (string message, Exception inner)
: base (message, inner)
{
}
};
public class PositionOriginNotSupportedException : MediaException
{
public PositionOriginNotSupportedException ()
{
}
public PositionOriginNotSupportedException (string message)
: base (message)
{
}
public PositionOriginNotSupportedException (string message, Exception inner)
: base (message, inner)
{
}
};
public class InvalidPositionException : MediaException
{
public InvalidPositionException ()
{
}
public InvalidPositionException (string message)
: base (message)
{
}
public InvalidPositionException (string message, Exception inner)
: base (message, inner)
{
}
};
public class PlaylistException : MediaException
{
public PlaylistException ()
{
}
public PlaylistException (string message)
: base (message)
{
}
public PlaylistException (string message, Exception inner)
: base (message, inner)
{
}
};
public class InternalException : MediaException
{
public InternalException ()
{
}
public InternalException (string message)
: base (message)
{
}
public InternalException (string message, Exception inner)
: base (message, inner)
{
}
};
};
/*
* libvlc.cs - libvlc-control CIL bindings
*
* $Id$
*/
/**********************************************************************
* Copyright (C) 2007 Rémi Denis-Courmont. *
* This program is free software; you can redistribute and/or modify *
* it under the terms of the GNU General Public License as published *
* by the Free Software Foundation; version 2 of the license, or (at *
* your option) any later version. *
* *
* This program 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 General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, you can get it from: *
* http://www.gnu.org/copyleft/gpl.html *
**********************************************************************/
using System;
using System.Runtime.InteropServices;
namespace VideoLAN.VLC
{
public class MediaControl : IDisposable
{
/**
* Possible player status
*/
enum PlayerStatus
{
PlayingStatus,
PauseStatus,
ForwardStatus,
BackwardStatus,
InitStatus,
EndStatus,
UndefinedStatus,
};
enum PositionOrigin
{
AbsolutePosition,
RelativePosition,
ModuloPosition,
};
enum PositionKey
{
ByteCount,
SampleCount,
MediaTime,
};
MediaControlHandle self;
private void CheckDisposed ()
{
if (self.IsInvalid)
throw new ObjectDisposedException ("Media controlled disposed");
}
/**
* Creates a MediaControl with a new LibVLC instance
*/
public MediaControl (string[] args)
{
NativeException e = NativeException.Prepare ();
U8String[] argv = new U8String[args.Length];
for (int i = 0; i < args.Length; i++)
argv[i] = new U8String (args[i]);
self = MediaControlAPI.New (argv.Length, argv, ref e);
e.Consume ();
}
/**
* Creates a MediaControl from an existing LibVLC instance
*/
/*public MediaControl (MediaControl instance)
{
NativeException e = NativeException.Prepare ();
IntPtr libvlc = mediacontrol_get_libvlc_instance (instance.self);
self = mediacontrol_new_from_instance (libvlc, ref e);
e.Consume ();
}*/
/*public void Play (from)
{
CheckDisposed ();
throw new NotImplementedException ();
}*/
public void Resume ()
{
CheckDisposed ();
NativeException e = NativeException.Prepare ();
MediaControlAPI.Resume (self, IntPtr.Zero, ref e);
e.Consume ();
}
public void Pause ()
{
CheckDisposed ();
NativeException e = NativeException.Prepare ();
MediaControlAPI.Pause (self, IntPtr.Zero, ref e);
e.Consume ();
}
public void Stop ()
{
CheckDisposed ();
NativeException e = NativeException.Prepare ();
MediaControlAPI.Stop (self, IntPtr.Zero, ref e);
e.Consume ();
}
public void AddItem (string mrl)
{
CheckDisposed ();
U8String nmrl = new U8String (mrl);
NativeException e = NativeException.Prepare ();
MediaControlAPI.PlaylistAddItem (self, nmrl, ref e);
e.Consume ();
}
public void Clear ()
{
CheckDisposed ();
NativeException e = NativeException.Prepare ();
MediaControlAPI.PlaylistClear (self, ref e);
e.Consume ();
}
public string[] Playlist
{
get
{
CheckDisposed ();
throw new NotImplementedException ();
}
}
public void NextItem ()
{
CheckDisposed ();
NativeException e = NativeException.Prepare ();
MediaControlAPI.PlaylistNextItem (self, ref e);
e.Consume ();
}
public void Dispose ()
{
self.Dispose ();
}
};
};
/*
* libvlc.cs - libvlc-control CIL bindings
*
* $Id$
*/
/**********************************************************************
* Copyright (C) 2007 Rémi Denis-Courmont. *
* This program is free software; you can redistribute and/or modify *
* it under the terms of the GNU General Public License as published *
* by the Free Software Foundation; version 2 of the license, or (at *
* your option) any later version. *
* *
* This program 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 General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, you can get it from: *
* http://www.gnu.org/copyleft/gpl.html *
**********************************************************************/
using System;
using System.Runtime.InteropServices;
namespace VideoLAN.VLC
{
internal class MediaControlAPI
{
[DllImport ("libvlc-control.dll", EntryPoint="mediacontrol_new")]
public static extern MediaControlHandle New (int argc, U8String[] argv, ref NativeException e);
[DllImport ("libvlc-control.dll", EntryPoint="mediacontrol_exit")]
public static extern void Exit (IntPtr self);
[DllImport ("libvlc-control.dll", EntryPoint="mediacontrol_start")]
public static extern void Start (MediaControlHandle self, IntPtr pos, ref NativeException e);
[DllImport ("libvlc-control.dll", EntryPoint="mediacontrol_pause")]
public static extern void Pause (MediaControlHandle self, IntPtr dummy, ref NativeException e);
[DllImport ("libvlc-control.dll", EntryPoint="mediacontrol_resume")]
public static extern void Resume (MediaControlHandle self, IntPtr dummy, ref NativeException e);
[DllImport ("libvlc-control.dll", EntryPoint="mediacontrol_stop")]
public static extern void Stop (MediaControlHandle self, IntPtr dummy, ref NativeException e);
[DllImport ("libvlc-control.dll", EntryPoint="mediacontrol_playlist_add_item")]
public static extern void PlaylistAddItem (MediaControlHandle self, U8String mrl, ref NativeException e);
[DllImport ("libvlc-control.dll", EntryPoint="mediacontrol_playlist_clear")]
public static extern void PlaylistClear (MediaControlHandle self, ref NativeException e);
[DllImport ("libvlc-control.dll", EntryPoint="mediacontrol_playlist_get_list")]
public static extern IntPtr PlaylistGetList (MediaControlHandle self, ref NativeException e);
[DllImport ("libvlc-control.dll", EntryPoint="mediacontrol_playlist_next_item")]
public static extern void PlaylistNextItem (MediaControlHandle self, ref NativeException e);
}
/**
* Abstract safe handle class for non-NULL pointers
* (Microsoft.* namespace has a similar class, but lets stick to System.*)
*/
internal abstract class NonNullHandle : SafeHandle
{
protected NonNullHandle ()
: base (IntPtr.Zero, true)
{
}
public override bool IsInvalid
{
get
{
return IsClosed || (handle == IntPtr.Zero);
}
}
};
internal sealed class MediaControlHandle : NonNullHandle
{
private MediaControlHandle ()
{
}
protected override bool ReleaseHandle ()
{
MediaControlAPI.Exit (handle);
return true;
}
};
/**
* Wrapper around native UTF-8 nul-terminated character arrays
*/
[StructLayout (LayoutKind.Sequential)]
internal sealed struct U8String
{
byte[] mb_str;
public U8String (string value)
{
byte[] bytes = System.Text.Encoding.UTF8.GetBytes (value);
mb_str = new byte[bytes.Length + 1];
Array.Copy (bytes, mb_str, bytes.Length);
mb_str[bytes.Length] = 0;
}
public U8String (IntPtr ptr)
{
if (ptr == IntPtr.Zero)
return;
int i = 0;
while (Marshal.ReadByte (ptr, i) != 0)
i++;
i++;
mb_str = new byte[i];
Marshal.Copy (ptr, mb_str, 0, i);
}
public override string ToString ()
{
if (mb_str == null)
return null;
byte[] bytes = new byte[mb_str.Length - 1];
Array.Copy (mb_str, bytes, bytes.Length);
return System.Text.Encoding.UTF8.GetString (bytes);
}
};
/**
* LibVLC native exception structure
*/
[StructLayout (LayoutKind.Sequential)]
internal sealed struct NativeException
{
public int code;
public IntPtr message;
public string Message
{
get
{
return new U8String (message).ToString ();
}
}
[DllImport ("libvlc-control.dll")]
static extern void mediacontrol_exception_init (ref NativeException e);
[DllImport ("libvlc-control.dll")]
static extern void mediacontrol_exception_cleanup (ref NativeException e);
public static NativeException Prepare ()
{
NativeException e = new NativeException ();
mediacontrol_exception_init (ref e);
return e;
}
public void Consume ()
{
try
{
Exception e;
string m = Message;
switch (this.code)
{
case 0:
e = null;
break;
case 1:
e = new PositionKeyNotSupportedException (m);
break;
case 2:
e = new PositionOriginNotSupportedException (m);
break;
case 3:
e = new InvalidPositionException (m);
break;
case 4:
e = new PlaylistException (m);
break;
case 5:
e = new InternalException (m);
break;
default:
e = new MediaException (m);
break;
}
if (e != null)
throw e;
}
finally
{
mediacontrol_exception_cleanup (ref this);
}
}
};
};
/*
* testvlc.cs - tests for libvlc-control CIL bindings
*
* $Id$
*/
/**********************************************************************
* Copyright (C) 2007 Rémi Denis-Courmont. *
* This program is free software; you can redistribute and/or modify *
* it under the terms of the GNU General Public License as published *
* by the Free Software Foundation; version 2 of the license, or (at *
* your option) any later version. *
* *
* This program 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 General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, you can get it from: *
* http://www.gnu.org/copyleft/gpl.html *
**********************************************************************/
using System;
namespace VideoLAN.VLC
{
public sealed class Test
{
public static int Main (string[] args)
{
MediaControl mc = new MediaControl (args);
foreach (string s in args)
mc.AddItem (s);
/*mc.Play ();*/
Console.ReadLine ();
mc.Stop ();
mc.Clear ();
mc.Dispose ();
return 0;
}
};
};
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment