[Mono-devel-list] Interop with Xine
john.luke at gmail.com
Thu Dec 9 19:41:38 EST 2004
Seems like you just have a small bug somewhere but its rather
impossible to tell from this message. I wonder if it would not be
better to just call xine-lib directly from C#. I was exploring this
months ago and it seemed to work really well (at least for audio). What
I have is probably overkill for a simple audio player but anyone who is
interested can contact me off list and I'll send you a tarball. I
haven't gotten through the video and event queueing for it to be
considered a complete binding.
On Fri, 2004-12-10 at 01:19 +0100, Simon Ask Ulsnes wrote:
> I'm developing yet another music player app for Linux. It's a bit like
> Muine, but more minimalistic and l33t... :-)
> The whole idea, and the reason I bothered making another audio player,
> is the concept of a "cut-the-crap" GUI without *anything* but a
> playlist, a search box and a search bar.
> I'm planning on using the Xine engine (xinelib), because 1) it's a very
> easy API and 2) I don't have to do format recognition or have anything
> to do with I/O except for file names.
> The binding library for xinelib is written in C++ (because I find it
> easier and more comprehensible than C - practically it makes no
> difference except I use cout instead of printf... I should probably
> rewrite it in C when I get around to it). Now, I have a small testing
> app for testing new functions I implement in the library (so that I'll
> know when the library part works properly).
> The library includes an initialization function that intializes (duh...)
> the Xine engine and creates the necessary objects and streams and so on.
> It goes something like this:
> engine = new XineEngine; // a struct for holding the objects, nothing
> special - engine is static in the .cpp file of the library
> engine->ao_driver = "auto"; // select audio output driver automatically
> engine->xine = xine_new(); // create the xine object
> xine_init(engine->xine); // internal initialization of the xine
> object - xine_init is an API function
> (... do some audio port opening and stream creating ...)
> The thing is: My testing app runs initialization and creation and
> destruction of all objects just fine. But when I do *exactly* the same
> thing, same order, same parameters, from C# via Interop, I get this:
> --- OUTPUT START ---
> Initializing Engine (xine µ player)...
> setting ao_driver...auto
> creating xine object...
> setting configfile...
> loading config...
> init'ing xine...
> Unhandled Exception: System.NullReferenceException: Object reference not
> set to an instance of an object
> in (unmanaged) (wrapper managed-to-native) Oiga.Xine:Init (string)
> in <0x00004> (wrapper managed-to-native) Oiga.Xine:Init (string)
> in <0x00017> Oiga.Xine:.ctor (string)
> in <0x0005c> Oiga.MainApp:.ctor ()
> in <0x0001b> Oiga.MainApp:Main (string)
> Segmentation Fault
> --- OUTPUT END ---
> What's that all about? No objects are being marshalled at all, since the
> Xine engine and the XineEngine struct containing the pointers only
> exists as a static object within unmanaged space. Any suggestions?
> Oh, and one thing more: I took a peek in the Muine source, and as far as
> I could tell they do it exactly the same way as I do! Tell me if you
> need the source to say anything useful, I'll have to go to bed now.
> Simon Ask Ulsnes
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
More information about the Mono-devel-list