Blame ports/MSVC++/2008clr/examples/ReplaceReaderclr/Program.cs

Packit c32a2d
/*
Packit c32a2d
	replacereaderclr: test program for mpg123clr, showing how to use ReplaceReader in a CLR enviro.
Packit c32a2d
	copyright 2009 by the mpg123 project - free software under the terms of the LGPL 2.1
Packit c32a2d
	see COPYING and AUTHORS files in distribution or http://mpg123.org	
Packit c32a2d

Packit c32a2d
    initially written by Malcolm Boczek
Packit c32a2d
  
Packit c32a2d
    not to be used as an example of good coding practices, note the total absence of error handling!!!  
Packit c32a2d
*/
Packit c32a2d

Packit c32a2d
/*
Packit c32a2d
	1.9.0.0 24-Sep-09	Function names harmonized with libmpg123 (mb)
Packit c32a2d
	1.12.0.0 14-Apr-10	Added ReplaceReaderHandle sample code (mb)
Packit c32a2d
*/
Packit c32a2d

Packit c32a2d
using System;
Packit c32a2d
using System.Collections.Generic;
Packit c32a2d
using System.Linq;
Packit c32a2d
using System.Text;
Packit c32a2d

Packit c32a2d
using System.IO;                        // for ReplaceReaderHandle example
Packit c32a2d
using System.Runtime.InteropServices;   // for ReplaceReaderHandle example
Packit c32a2d

Packit c32a2d
using mpg123clr;
Packit c32a2d

Packit c32a2d
namespace ReplaceReaderclr
Packit c32a2d
{
Packit c32a2d
    class Program
Packit c32a2d
    {
Packit c32a2d
        private unsafe static int MyReadFunc(int a, void* b, uint c)
Packit c32a2d
        {
Packit c32a2d
            // need to call posix read function here...
Packit c32a2d

Packit c32a2d
            // PosixRead is an example, substitute your replacement function here.
Packit c32a2d
            int ret = mpg123.PosixRead(a, b, c);
Packit c32a2d

Packit c32a2d
            return ret;
Packit c32a2d
        }
Packit c32a2d

Packit c32a2d
        private static int MySeekFunc(int a, int b, int c)
Packit c32a2d
        {
Packit c32a2d
            // NOTE: Largefile conflict with use of "int" position values.
Packit c32a2d
            // Convert to long if off_t is defined as long long
Packit c32a2d

Packit c32a2d
            // need to call posix lseek function here...
Packit c32a2d

Packit c32a2d
            // PosixSeek is an example, substitute your replacement function here.
Packit c32a2d
            int ret = mpg123.PosixSeek(a, b, c);
Packit c32a2d

Packit c32a2d
            return ret;
Packit c32a2d
        }
Packit c32a2d

Packit c32a2d
        private unsafe static int MyHandleReadFunc(void* a, void* b, uint c)
Packit c32a2d
        {
Packit c32a2d
            GCHandle gch = GCHandle.FromIntPtr((IntPtr)a);
Packit c32a2d
            BinaryReader br = (BinaryReader)gch.Target;
Packit c32a2d

Packit c32a2d
            byte[] buf = br.ReadBytes((int)c);
Packit c32a2d

Packit c32a2d
            // NOTE: no discernible performance difference between Marshal.Copy and ptr++ loop
Packit c32a2d
            Marshal.Copy(buf, 0, (IntPtr)b, buf.Length);
Packit c32a2d

Packit c32a2d
//            byte* ptr = (byte*)b;
Packit c32a2d
//            for (int i = 0, l = buf.Length; i < l; i++)
Packit c32a2d
//                *(ptr++) = buf[i];
Packit c32a2d

Packit c32a2d
            return buf.Length;
Packit c32a2d
        }
Packit c32a2d

Packit c32a2d
        private unsafe static int MyHandleSeekFunc(void* a, int b, int c)
Packit c32a2d
        {
Packit c32a2d
            // NOTE: Largefile conflict with use of "int" position values.
Packit c32a2d
            // Convert to long if off_t is defined as long long
Packit c32a2d

Packit c32a2d
            GCHandle gch = GCHandle.FromIntPtr((IntPtr)a);
Packit c32a2d
            BinaryReader br = (BinaryReader)gch.Target;
Packit c32a2d

Packit c32a2d
            return (int)br.BaseStream.Seek(b, (SeekOrigin)c);
Packit c32a2d
        }
Packit c32a2d

Packit c32a2d
        private unsafe static void MyHandleCleanFunc(void* a)
Packit c32a2d
        {
Packit c32a2d
            GCHandle gch = GCHandle.FromIntPtr((IntPtr)a);
Packit c32a2d
            BinaryReader br = (BinaryReader)gch.Target;
Packit c32a2d

Packit c32a2d
            br.Close();
Packit c32a2d
        }
Packit c32a2d

Packit c32a2d
        static unsafe void Main(string[] args)
Packit c32a2d
        {
Packit c32a2d
            if (args.Length == 0)
Packit c32a2d
            {
Packit c32a2d
                Console.WriteLine("I need a file to work on:\n\nPress any key to exit.");
Packit c32a2d
                while (Console.Read() == 0) ;
Packit c32a2d
                return;
Packit c32a2d
            }
Packit c32a2d
            mpg123clr.mpg.ErrorCode err;
Packit c32a2d

Packit c32a2d
            string filename = args[0];
Packit c32a2d

Packit c32a2d
            err = mpg123.mpg123_init();
Packit c32a2d
            Console.WriteLine("Init:");
Packit c32a2d

Packit c32a2d
            RunReplaceReaderTest(filename);
Packit c32a2d
            RunReplaceReaderHandleTest(filename);
Packit c32a2d
            RunFrameByFrameTest(filename);
Packit c32a2d

Packit c32a2d
            Console.WriteLine("\nPress any key to exit:");
Packit c32a2d
            while (Console.Read() == 0) ;
Packit c32a2d

Packit c32a2d
            mpg123.mpg123_exit();
Packit c32a2d
        }
Packit c32a2d

Packit c32a2d
        static unsafe void RunReplaceReaderTest(string filename)
Packit c32a2d
        {
Packit c32a2d
            mpg123clr.mpg.ErrorCode err;
Packit c32a2d

Packit c32a2d
            mpg123 mp = new mpg123();
Packit c32a2d
            err = mp.mpg123_new();
Packit c32a2d

Packit c32a2d
            // ReplaceReader example
Packit c32a2d
            mpg123clr.mpg123.ReadDelegate rdel = MyReadFunc;
Packit c32a2d
            mpg123clr.mpg123.SeekDelegate sdel = MySeekFunc;
Packit c32a2d
            err = mp.mpg123_replace_reader(rdel, sdel);
Packit c32a2d

Packit c32a2d
            //err = mp.mpg123_open(args[0]);
Packit c32a2d
            err = mp.mpg123_open(filename);
Packit c32a2d

Packit c32a2d
            if (err != mpg123clr.mpg.ErrorCode.ok)
Packit c32a2d
            {
Packit c32a2d
                Console.WriteLine("Error: " + mp.mpg123_strerror());
Packit c32a2d
            }
Packit c32a2d
            else
Packit c32a2d
            {
Packit c32a2d
                Console.WriteLine("Open:");
Packit c32a2d

Packit c32a2d
                // Show available decoders
Packit c32a2d
                string[] Decoders = mp.mpg123_decoders();
Packit c32a2d

Packit c32a2d
                if (Decoders.Length > 0)
Packit c32a2d
                {
Packit c32a2d
                    Console.WriteLine("\nDecoders:");
Packit c32a2d
                    foreach (string str in Decoders) Console.WriteLine(str);
Packit c32a2d
                }
Packit c32a2d

Packit c32a2d
                // Show supported decoders
Packit c32a2d
                string[] supDecoders = mp.mpg123_supported_decoders();
Packit c32a2d

Packit c32a2d
                if (supDecoders.Length > 0)
Packit c32a2d
                {
Packit c32a2d
                    Console.WriteLine("\nSupported Decoders:");
Packit c32a2d
                    foreach (string str in supDecoders) Console.WriteLine(str);
Packit c32a2d
                }
Packit c32a2d

Packit c32a2d
                // Show actual decoder
Packit c32a2d
                Console.WriteLine("\nDecoder: " + mp.mpg123_current_decoder());
Packit c32a2d

Packit c32a2d
                // Show estimated file length
Packit c32a2d
                Console.WriteLine("\nLength Estimate: " + mp.mpg123_length().ToString());
Packit c32a2d

Packit c32a2d
                // Scan - gets actual details including ID3v2 and Frame offsets
Packit c32a2d
                err = mp.mpg123_scan();
Packit c32a2d

Packit c32a2d
                // Show actual file length
Packit c32a2d
                if (err == mpg123clr.mpg.ErrorCode.ok) Console.WriteLine("Length Actual  : " + mp.mpg123_length().ToString());
Packit c32a2d

Packit c32a2d
                // Get ID3 data
Packit c32a2d
                mpg123clr.id3.mpg123id3v1 iv1;
Packit c32a2d
                mpg123clr.id3.mpg123id3v2 iv2;
Packit c32a2d
                err = mp.mpg123_id3(out iv1, out iv2);
Packit c32a2d

Packit c32a2d
                // Show ID3v2 data
Packit c32a2d
                Console.WriteLine("\nTitle  : " + iv2.title);
Packit c32a2d
                Console.WriteLine("Artist : " + iv2.artist);
Packit c32a2d
                Console.WriteLine("Album  : " + iv2.album);
Packit c32a2d
                Console.WriteLine("Comment: " + iv2.comment);
Packit c32a2d
                Console.WriteLine("Year   : " + iv2.year);
Packit c32a2d

Packit c32a2d
                // Demo seek (back to start of file - note: scan should already have done this)
Packit c32a2d
                long pos = mp.mpg123_seek(0, System.IO.SeekOrigin.Begin);
Packit c32a2d

Packit c32a2d
                long[] frameindex;
Packit c32a2d
                long step;
Packit c32a2d
                err = mp.mpg123_index(out frameindex, out step);
Packit c32a2d

Packit c32a2d
                if (err == mpg123clr.mpg.ErrorCode.ok)
Packit c32a2d
                {
Packit c32a2d
                    Console.WriteLine("\nFrameIndex:");
Packit c32a2d
                    foreach (long idx in frameindex)
Packit c32a2d
                    {
Packit c32a2d
                        // Console.WriteLine(idx.ToString());
Packit c32a2d
                    }
Packit c32a2d
                }
Packit c32a2d

Packit c32a2d
                int num;
Packit c32a2d
                uint cnt;
Packit c32a2d
                IntPtr audio;
Packit c32a2d

Packit c32a2d
                // Walk the file - effectively decode the data without using it...
Packit c32a2d
                Console.WriteLine("\nWalking  : " + iv2.title);
Packit c32a2d
                DateTime dte, dts = DateTime.Now;
Packit c32a2d

Packit c32a2d
                while (err == mpg123clr.mpg.ErrorCode.ok || err == mpg123clr.mpg.ErrorCode.new_format)
Packit c32a2d
                {
Packit c32a2d
                    err = mp.mpg123_decode_frame(out num, out audio, out cnt);
Packit c32a2d

Packit c32a2d
                    // do something with "audio" here....
Packit c32a2d
                }
Packit c32a2d

Packit c32a2d
                dte = DateTime.Now;
Packit c32a2d

Packit c32a2d
                TimeSpan ts = dte - dts;
Packit c32a2d
                Console.WriteLine("Duration:  " + ts.ToString());
Packit c32a2d

Packit c32a2d
                mp.mpg123_close();
Packit c32a2d
            }
Packit c32a2d

Packit c32a2d
            mp.Dispose();
Packit c32a2d
        }
Packit c32a2d

Packit c32a2d
        static unsafe void RunReplaceReaderHandleTest(string filename)
Packit c32a2d
        {
Packit c32a2d
            mpg123clr.mpg.ErrorCode err;
Packit c32a2d

Packit c32a2d
            mpg123 mp = new mpg123();
Packit c32a2d
            err = mp.mpg123_new();
Packit c32a2d

Packit c32a2d
            // ReplaceReader example
Packit c32a2d
            mpg123clr.mpg123.ReadHandleDelegate rdel = MyHandleReadFunc;
Packit c32a2d
            mpg123clr.mpg123.SeekHandleDelegate sdel = MyHandleSeekFunc;
Packit c32a2d
            mpg123clr.mpg123.CleanupHandleDelegate cdel = MyHandleCleanFunc;
Packit c32a2d
            err = mp.mpg123_replace_reader_handle(rdel, sdel, cdel);
Packit c32a2d

Packit c32a2d
            //err = mp.mpg123_open(args[0]);
Packit c32a2d
            BinaryReader br = new BinaryReader(File.OpenRead(filename));
Packit c32a2d

Packit c32a2d
            err = mp.mpg123_open_handle(br);
Packit c32a2d

Packit c32a2d
            if (err != mpg123clr.mpg.ErrorCode.ok)
Packit c32a2d
            {
Packit c32a2d
                Console.WriteLine("Error: " + mp.mpg123_strerror());
Packit c32a2d
            }
Packit c32a2d
            else
Packit c32a2d
            {
Packit c32a2d
                Console.WriteLine("Open:");
Packit c32a2d

Packit c32a2d
                // Show available decoders
Packit c32a2d
                string[] Decoders = mp.mpg123_decoders();
Packit c32a2d

Packit c32a2d
                if (Decoders.Length > 0)
Packit c32a2d
                {
Packit c32a2d
                    Console.WriteLine("\nDecoders:");
Packit c32a2d
                    foreach (string str in Decoders) Console.WriteLine(str);
Packit c32a2d
                }
Packit c32a2d

Packit c32a2d
                // Show supported decoders
Packit c32a2d
                string[] supDecoders = mp.mpg123_supported_decoders();
Packit c32a2d

Packit c32a2d
                if (supDecoders.Length > 0)
Packit c32a2d
                {
Packit c32a2d
                    Console.WriteLine("\nSupported Decoders:");
Packit c32a2d
                    foreach (string str in supDecoders) Console.WriteLine(str);
Packit c32a2d
                }
Packit c32a2d

Packit c32a2d
                // Show actual decoder
Packit c32a2d
                Console.WriteLine("\nDecoder: " + mp.mpg123_current_decoder());
Packit c32a2d

Packit c32a2d
                // Show estimated file length
Packit c32a2d
                Console.WriteLine("\nLength Estimate: " + mp.mpg123_length().ToString());
Packit c32a2d

Packit c32a2d
                // Scan - gets actual details including ID3v2 and Frame offsets
Packit c32a2d
                err = mp.mpg123_scan();
Packit c32a2d

Packit c32a2d
                // Show actual file length
Packit c32a2d
                if (err == mpg123clr.mpg.ErrorCode.ok) Console.WriteLine("Length Actual  : " + mp.mpg123_length().ToString());
Packit c32a2d

Packit c32a2d
                // Get ID3 data
Packit c32a2d
                mpg123clr.id3.mpg123id3v1 iv1;
Packit c32a2d
                mpg123clr.id3.mpg123id3v2 iv2;
Packit c32a2d
                err = mp.mpg123_id3(out iv1, out iv2);
Packit c32a2d

Packit c32a2d
                // Show ID3v2 data
Packit c32a2d
                Console.WriteLine("\nTitle  : " + iv2.title);
Packit c32a2d
                Console.WriteLine("Artist : " + iv2.artist);
Packit c32a2d
                Console.WriteLine("Album  : " + iv2.album);
Packit c32a2d
                Console.WriteLine("Comment: " + iv2.comment);
Packit c32a2d
                Console.WriteLine("Year   : " + iv2.year);
Packit c32a2d

Packit c32a2d
                // Demo seek (back to start of file - note: scan should already have done this)
Packit c32a2d
                long pos = mp.mpg123_seek(0, System.IO.SeekOrigin.Begin);
Packit c32a2d

Packit c32a2d
                long[] frameindex;
Packit c32a2d
                long step;
Packit c32a2d
                err = mp.mpg123_index(out frameindex, out step);
Packit c32a2d

Packit c32a2d
                if (err == mpg123clr.mpg.ErrorCode.ok)
Packit c32a2d
                {
Packit c32a2d
                    Console.WriteLine("\nFrameIndex:");
Packit c32a2d
                    foreach (long idx in frameindex)
Packit c32a2d
                    {
Packit c32a2d
                        // Console.WriteLine(idx.ToString());
Packit c32a2d
                    }
Packit c32a2d
                }
Packit c32a2d

Packit c32a2d
                int num;
Packit c32a2d
                uint cnt;
Packit c32a2d
                IntPtr audio;
Packit c32a2d

Packit c32a2d
                // Walk the file - effectively decode the data without using it...
Packit c32a2d
                Console.WriteLine("\nWalking  : " + iv2.title);
Packit c32a2d
                DateTime dte, dts = DateTime.Now;
Packit c32a2d

Packit c32a2d
                while (err == mpg123clr.mpg.ErrorCode.ok || err == mpg123clr.mpg.ErrorCode.new_format)
Packit c32a2d
                {
Packit c32a2d
                    err = mp.mpg123_decode_frame(out num, out audio, out cnt);
Packit c32a2d

Packit c32a2d
                    // do something with "audio" here....
Packit c32a2d
                }
Packit c32a2d

Packit c32a2d
                dte = DateTime.Now;
Packit c32a2d

Packit c32a2d
                TimeSpan ts = dte - dts;
Packit c32a2d
                Console.WriteLine("Duration:  " + ts.ToString());
Packit c32a2d

Packit c32a2d
                mp.mpg123_close();
Packit c32a2d
            }
Packit c32a2d

Packit c32a2d
            mp.Dispose();
Packit c32a2d

Packit c32a2d
        }
Packit c32a2d

Packit c32a2d
        static unsafe void RunFrameByFrameTest(string filename)
Packit c32a2d
        {
Packit c32a2d
            mpg123clr.mpg.ErrorCode err;
Packit c32a2d

Packit c32a2d
            mpg123 mp = new mpg123();
Packit c32a2d
            err = mp.mpg123_new();
Packit c32a2d

Packit c32a2d
            err = mp.mpg123_open(filename);
Packit c32a2d

Packit c32a2d
            if (err != mpg123clr.mpg.ErrorCode.ok)
Packit c32a2d
            {
Packit c32a2d
                Console.WriteLine("Error: " + mp.mpg123_strerror());
Packit c32a2d
            }
Packit c32a2d
            else
Packit c32a2d
            {
Packit c32a2d
                Console.WriteLine("Open:");
Packit c32a2d

Packit c32a2d
                // Show available decoders
Packit c32a2d
                string[] Decoders = mp.mpg123_decoders();
Packit c32a2d

Packit c32a2d
                if (Decoders.Length > 0)
Packit c32a2d
                {
Packit c32a2d
                    Console.WriteLine("\nDecoders:");
Packit c32a2d
                    foreach (string str in Decoders) Console.WriteLine(str);
Packit c32a2d
                }
Packit c32a2d

Packit c32a2d
                // Show supported decoders
Packit c32a2d
                string[] supDecoders = mp.mpg123_supported_decoders();
Packit c32a2d

Packit c32a2d
                if (supDecoders.Length > 0)
Packit c32a2d
                {
Packit c32a2d
                    Console.WriteLine("\nSupported Decoders:");
Packit c32a2d
                    foreach (string str in supDecoders) Console.WriteLine(str);
Packit c32a2d
                }
Packit c32a2d

Packit c32a2d
                // Show actual decoder
Packit c32a2d
                Console.WriteLine("\nDecoder: " + mp.mpg123_current_decoder());
Packit c32a2d

Packit c32a2d
                // Show estimated file length
Packit c32a2d
                Console.WriteLine("\nLength Estimate: " + mp.mpg123_length().ToString());
Packit c32a2d

Packit c32a2d
                // Scan - gets actual details including ID3v2 and Frame offsets
Packit c32a2d
                err = mp.mpg123_scan();
Packit c32a2d

Packit c32a2d
                // Show actual file length
Packit c32a2d
                if (err == mpg123clr.mpg.ErrorCode.ok) Console.WriteLine("Length Actual  : " + mp.mpg123_length().ToString());
Packit c32a2d

Packit c32a2d
                // Get ID3 data
Packit c32a2d
                mpg123clr.id3.mpg123id3v1 iv1;
Packit c32a2d
                mpg123clr.id3.mpg123id3v2 iv2;
Packit c32a2d
                err = mp.mpg123_id3(out iv1, out iv2);
Packit c32a2d

Packit c32a2d
                // Show ID3v2 data
Packit c32a2d
                Console.WriteLine("\nTitle  : " + iv2.title);
Packit c32a2d
                Console.WriteLine("Artist : " + iv2.artist);
Packit c32a2d
                Console.WriteLine("Album  : " + iv2.album);
Packit c32a2d
                Console.WriteLine("Comment: " + iv2.comment);
Packit c32a2d
                Console.WriteLine("Year   : " + iv2.year);
Packit c32a2d

Packit c32a2d
                // Demo seek (back to start of file - note: scan should already have done this)
Packit c32a2d
                long pos = mp.mpg123_seek(0, System.IO.SeekOrigin.Begin);
Packit c32a2d

Packit c32a2d
                long[] frameindex;
Packit c32a2d
                long step;
Packit c32a2d
                err = mp.mpg123_index(out frameindex, out step);
Packit c32a2d

Packit c32a2d
                if (err == mpg123clr.mpg.ErrorCode.ok)
Packit c32a2d
                {
Packit c32a2d
                    Console.WriteLine("\nFrameIndex:");
Packit c32a2d
                    foreach (long idx in frameindex)
Packit c32a2d
                    {
Packit c32a2d
                        // Console.WriteLine(idx.ToString());
Packit c32a2d
                    }
Packit c32a2d
                }
Packit c32a2d

Packit c32a2d
                int num;
Packit c32a2d
                uint cnt;
Packit c32a2d
                IntPtr audio;
Packit c32a2d

Packit c32a2d
                // Walk the file - effectively decode the data without using it...
Packit c32a2d
                Console.WriteLine("\nFrame Walking  : " + iv2.title);
Packit c32a2d
                DateTime dte, dts = DateTime.Now;
Packit c32a2d

Packit c32a2d
                while (err == mpg123clr.mpg.ErrorCode.ok || err == mpg123clr.mpg.ErrorCode.new_format)
Packit c32a2d
                {
Packit c32a2d
                    err = mp.mpg123_framebyframe_decode(out num, out audio, out cnt);
Packit c32a2d
                    err = mp.mpg123_framebyframe_next();
Packit c32a2d

Packit c32a2d
                    // do something with "audio" here....
Packit c32a2d
                }
Packit c32a2d

Packit c32a2d
                dte = DateTime.Now;
Packit c32a2d

Packit c32a2d
                TimeSpan ts = dte - dts;
Packit c32a2d
                Console.WriteLine("Duration:  " + ts.ToString());
Packit c32a2d

Packit c32a2d
                mp.mpg123_close();
Packit c32a2d
            }
Packit c32a2d

Packit c32a2d
            mp.Dispose();
Packit c32a2d

Packit c32a2d
        }
Packit c32a2d
    }
Packit c32a2d
}