|
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 |
}
|