Blame ports/MSVC++/2008clr/mpg123clr/mpg123clr.h

Packit c32a2d
/*
Packit c32a2d
	mpg123clr: MPEG Audio Decoder library Common Language Runtime version.
Packit c32a2d

Packit c32a2d
	copyright 2009-2011 by Malcolm Boczek - free software under the terms of the LGPL 2.1
Packit c32a2d
	mpg123clr.dll is a derivative work of libmpg123 - all original mpg123 licensing terms apply.
Packit c32a2d

Packit c32a2d
	All rights to this work freely assigned to the mpg123 project.
Packit c32a2d
*/
Packit c32a2d
/*
Packit c32a2d
	libmpg123: MPEG Audio Decoder library
Packit c32a2d

Packit c32a2d
	copyright 1995-2011 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
*/
Packit c32a2d
/*
Packit c32a2d
	1.8.1.0	04-Aug-09	Initial release.
Packit c32a2d
	1.9.0.0 24-Sep-09	Function names harmonized with libmpg123 (mb)
Packit c32a2d
	1.10.0.0 30-Nov-09	release match - added mpg123_feature (mb)
Packit c32a2d
	1.12.0.0 14-Apr-10	release match - added framebyframe and "handle" ReplaceReaders (mb)
Packit c32a2d
	1.13.0.0 13-Jan-11	release match - added encsize (mb)
Packit c32a2d
*/
Packit c32a2d

Packit c32a2d
#pragma once
Packit c32a2d

Packit c32a2d
#pragma warning(disable : 4635)
Packit c32a2d
#include "mpg123.h"
Packit c32a2d
#pragma warning(default : 4635)
Packit c32a2d

Packit c32a2d
#include "enum.h"
Packit c32a2d
#include "error.h"
Packit c32a2d
#include "id3v1.h"
Packit c32a2d
#include "id3v2.h"
Packit c32a2d
#include "advanced.h"
Packit c32a2d

Packit c32a2d
#include <io.h>		// for posix proof of concept only
Packit c32a2d

Packit c32a2d
#include <string>
Packit c32a2d
#include <iostream>
Packit c32a2d
#include <stdarg.h>
Packit c32a2d

Packit c32a2d
#include <vcclr.h>
Packit c32a2d
using namespace std;
Packit c32a2d
using namespace System;
Packit c32a2d
using namespace System::IO;
Packit c32a2d
using namespace System::Runtime::InteropServices;
Packit c32a2d

Packit c32a2d
namespace mpg123clr
Packit c32a2d
{
Packit c32a2d

Packit c32a2d

Packit c32a2d
	// Recommended usage when creating reference type on the managed heap (not using stack semantics 
Packit c32a2d
	//  for reference types...) [see (Microsoft) Destructors and Finalizers in Visual C++]
Packit c32a2d
	//
Packit c32a2d
	// C++/CLI
Packit c32a2d
	// A myA;
Packit c32a2d
	//		// use myA here
Packit c32a2d
	//
Packit c32a2d
	// Equivalent user code:
Packit c32a2d
	//
Packit c32a2d
	// A ^ myA = gcnew A;
Packit c32a2d
	// try { /* use myA here */ } finally { delete myA; }
Packit c32a2d
	//
Packit c32a2d
	//
Packit c32a2d
	// C# (from wikipedia)
Packit c32a2d
	// using(A myA = new A()) { /* Use myA here */ }
Packit c32a2d
    // Compiler calls myA.Dispose(), in a "finally" of a "try/finally" block
Packit c32a2d
	//
Packit c32a2d
    // Equivalent user code:
Packit c32a2d
	//
Packit c32a2d
    //  A myA = new myA();
Packit c32a2d
    //  try { /* Use myA here */ } finally { myA.Dispose(); }
Packit c32a2d
	//
Packit c32a2d
	// Otherwise Finalizer will be nondeterministically called by GC
Packit c32a2d

Packit c32a2d

Packit c32a2d
	///<summary>Wrapper for libmpg123.</summary>
Packit c32a2d
	public ref class mpg123
Packit c32a2d
	{
Packit c32a2d

Packit c32a2d
#pragma region Callback and Delegate
Packit c32a2d

Packit c32a2d
		// Functional callbacks for low-level I/O ReplaceReader
Packit c32a2d

Packit c32a2d
	public:
Packit c32a2d
		///<summary>Seek Delegate.
Packit c32a2d
		///<para>Callback seek function to provide low-level stream access to posix-like seek operations.
Packit c32a2d
		/// Requires user supplied static callback fuction of form off_t fn(int fd, off_t offset, int origin).</para>
Packit c32a2d
		///<para>Returns callee supplied resulting offset from start of file or -1 for error.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="fd">Contains file descriptor.</param>
Packit c32a2d
		///<param name="offset">Contains required offset value.</param>
Packit c32a2d
		///<param name="origin">Contains relative origin value (whence) applied to offset.</param>
Packit c32a2d
		///<returns>Callee supplied resulting offset from start of file or -1 for error.</returns>
Packit c32a2d
		[UnmanagedFunctionPointer(CallingConvention::Cdecl)]		
Packit c32a2d
		delegate off_t SeekDelegate(int fd, off_t offset, int origin);
Packit c32a2d

Packit c32a2d
		[UnmanagedFunctionPointer(CallingConvention::Cdecl)]		
Packit c32a2d
		delegate off_t SeekHandleDelegate(void* handle, off_t offset, int origin);
Packit c32a2d

Packit c32a2d
		///<summary>Read Delegate.
Packit c32a2d
		///<para>Callback read function to provide low-level stream access to posix-like read operations.
Packit c32a2d
		/// Requires user supplied static callback fuction of form ssize_t fn(int fd, void* buffer, size_t size).</para>
Packit c32a2d
		///<para>Returns callee supplied resulting actual number of bytes read or -1 for error.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="fd">Contains file descriptor.</param>
Packit c32a2d
		///<param name="offset">Contains address of buffer.</param>
Packit c32a2d
		///<param name="origin">Contains size of buffer.</param>
Packit c32a2d
		///<returns>Callee supplied resulting actual number of bytes read or -1 for error.</returns>
Packit c32a2d
		[UnmanagedFunctionPointer(CallingConvention::Cdecl)]		
Packit c32a2d
		delegate ssize_t ReadDelegate(int fd, void* buffer, size_t size);
Packit c32a2d

Packit c32a2d
		[UnmanagedFunctionPointer(CallingConvention::Cdecl)]		
Packit c32a2d
		delegate ssize_t ReadHandleDelegate(void* handle, void* buffer, size_t size);
Packit c32a2d

Packit c32a2d
		[UnmanagedFunctionPointer(CallingConvention::Cdecl)]		
Packit c32a2d
		delegate void CleanupHandleDelegate(void* handle);
Packit c32a2d

Packit c32a2d
	private:
Packit c32a2d
		// Delegate "keep alive" fields to prevent GC of delegate.
Packit c32a2d
		SeekDelegate^ seekDel;
Packit c32a2d
		ReadDelegate^ readDel;
Packit c32a2d

Packit c32a2d
		SeekHandleDelegate^ seekHDel;
Packit c32a2d
		ReadHandleDelegate^ readHDel;
Packit c32a2d
		CleanupHandleDelegate^ cleanHDel;
Packit c32a2d

Packit c32a2d
		GCHandle userObjectHandle;
Packit c32a2d

Packit c32a2d
		// Temporary delegate store, replacereader action is defered until next stream 'open' action
Packit c32a2d
		SeekDelegate^ r_seekDel;
Packit c32a2d
		ReadDelegate^ r_readDel;
Packit c32a2d

Packit c32a2d
		SeekHandleDelegate^ r_seekHDel;
Packit c32a2d
		ReadHandleDelegate^ r_readHDel;
Packit c32a2d
		CleanupHandleDelegate^ r_cleanHDel;
Packit c32a2d

Packit c32a2d
		bool useHandleReplacement;
Packit c32a2d
		bool lastReplacementWasHandle;
Packit c32a2d

Packit c32a2d
#pragma endregion -Callback and Delegate
Packit c32a2d

Packit c32a2d

Packit c32a2d
#pragma region Library and Handle Setup
Packit c32a2d

Packit c32a2d
	// \defgroup mpg123_init mpg123 library and handle setup
Packit c32a2d
	//
Packit c32a2d
	// Functions to initialise and shutdown the mpg123 library and handles.
Packit c32a2d
	// The parameters of handles have workable defaults, you only have to tune them when you want to tune something;-)
Packit c32a2d
	// Tip: Use a RVA setting...
Packit c32a2d
	//
Packit c32a2d

Packit c32a2d
	private:
Packit c32a2d
		mpg123_handle* mh;
Packit c32a2d

Packit c32a2d
	internal:
Packit c32a2d
		mpg123(mpg123_handle* mh);
Packit c32a2d

Packit c32a2d
	protected:
Packit c32a2d
		///<summary>Finalizer.
Packit c32a2d
		///<para>Cleanly handles mpg123_delete of internal (unmanaged) mpg123 handle.</para></summary>
Packit c32a2d
		/// Implementation of CLR Finalize().
Packit c32a2d
		!mpg123(void);
Packit c32a2d

Packit c32a2d
	public:
Packit c32a2d
		///<summary>Constructor.
Packit c32a2d
		///<para>Only creates mpg123 object, you must call one of the New() methods to obtain a decoder library handle.</para>
Packit c32a2d
		///<para>Recommended usage: using(mpg123 obj = new mpg123()){ use obj here }</para></summary>
Packit c32a2d
		mpg123(void);
Packit c32a2d

Packit c32a2d
		///<summary>Destructor. Used for final object deletion.
Packit c32a2d
		///<para>Calls finalizer for clean disposal of internal (unmanaged) library handles.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		/// Implementation of CLR Dispose().
Packit c32a2d
		/// ~Destructor and !Finalizer are the prescribed implementation of Dispose() and Finalize().
Packit c32a2d
		/// See Destructors and Finalizers in Visual C++
Packit c32a2d
		~mpg123(void);
Packit c32a2d

Packit c32a2d
		///<summary>(mpg123_init) Function to initialise the mpg123 library. 
Packit c32a2d
		///<para>This function is not thread-safe. Call it exactly once per process, before any other (possibly threaded) work with the library.</para>
Packit c32a2d
		///<para>Returns MPG123_OK if successful, otherwise an error number.</para></summary>
Packit c32a2d
		///<returns>Returns MPG123_OK if successful, otherwise an error number.</returns>
Packit c32a2d
		static mpg123clr::mpg::ErrorCode __clrcall mpg123_init(void);
Packit c32a2d

Packit c32a2d
		///<summary>(mpg123_exit) Function to close down the mpg123 library. 
Packit c32a2d
		///<para>This function is not thread-safe. Call it exactly once per process, before any other (possibly threaded) work with the library.</para></summary>
Packit c32a2d
		static void __clrcall mpg123_exit(void);
Packit c32a2d

Packit c32a2d
		///<summary>(mpg123_new) Obtain am mpg123 handle with designated decoder.
Packit c32a2d
		///<para>Returns MPG123_OK or applicable error code.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="decoder">Name of the decoder to attach.</param>
Packit c32a2d
		///<returns>MPG123_OK or applicable error code.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_new(String ^ decoder);
Packit c32a2d

Packit c32a2d
		///<summary>Obtain an mpg123 handle with default decoder.
Packit c32a2d
		///<para>Returns MPG123_OK or applicable error code.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>MPG123_OK or applicable error code.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_new(void);
Packit c32a2d

Packit c32a2d
		///<summary>Obtain am mpg123 handle with default decoder.
Packit c32a2d
		///<para>Allows use of common parms object for multiple connections.</para> 
Packit c32a2d
		///<para>Returns MPG123_OK or applicable error code.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="par">Supplied Advanced parameter object.</param>
Packit c32a2d
		///<returns>MPG123_OK or applicable error code.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_parnew(mpg123clr::advpars^ par);
Packit c32a2d

Packit c32a2d
		///<summary>Obtain am mpg123 handle with designated decoder.
Packit c32a2d
		///<para>Allows use of common parms object for multiple connections.</para> 
Packit c32a2d
		///<para>Returns MPG123_OK or applicable error code.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="par">Supplied Advanced parameter object.</param>
Packit c32a2d
		///<param name="decoder">Name of the decoder to attach.</param>
Packit c32a2d
		///<returns>MPG123_OK or applicable error code.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_parnew(mpg123clr::advpars^ par, String^ decoder);
Packit c32a2d

Packit c32a2d
		///<summary>(mpg123_delete) Delete internal mpg123 handle.
Packit c32a2d
		///<para>The framework will dispose of the object when it goes out of scope - you do not need to explicitly call Delete().
Packit c32a2d
		/// However it is available to allow reuse of this object with successive handles - using New()/Delete() pairs.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		void __clrcall mpg123_delete(void);
Packit c32a2d

Packit c32a2d
	public:
Packit c32a2d

Packit c32a2d
		///<summary>Set a specific parameter value.
Packit c32a2d
		///<para>Returns MPG123_OK or applicable error code.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="type">Define the parameter to be set. (parms enumeration)</param>
Packit c32a2d
		///<param name="val">Integer value to apply.</param>
Packit c32a2d
		///<param name="fval">Real value to apply.</param>
Packit c32a2d
		///<returns>MPG123_OK or applicable error code.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_param(mpg123clr::mpg::parms type, int val, double fval);
Packit c32a2d

Packit c32a2d
		///<summary>Get a specific parameter value.
Packit c32a2d
		///<para>Returns MPG123_OK or applicable error code.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="type">Define the parameter to get. (parms enumeration)</param>
Packit c32a2d
		///<param name="val">Returned integer value.</param>
Packit c32a2d
		///<param name="fval">Returned real value.</param>
Packit c32a2d
		///<returns>MPG123_OK or applicable error code.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_getparam(mpg123clr::mpg::parms type, [Out] int% val, [Out] double% fval);
Packit c32a2d

Packit c32a2d
		///<summary>Query libmpg123 feature.
Packit c32a2d
		///<para>Returns 1 for success, 0 for unimplemented feature.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="key">Define the feature to query. (feature_set enumeration)</param>
Packit c32a2d
		///<returns>1 for success, 0 for unimplemented feature.</returns>
Packit c32a2d
		static int __clrcall mpg123_feature(mpg123clr::mpg::feature_set key);
Packit c32a2d

Packit c32a2d
#pragma endregion -Library and Handle Setup
Packit c32a2d

Packit c32a2d
#pragma region Internal Helpers
Packit c32a2d

Packit c32a2d
	internal:
Packit c32a2d
		array<String^>^ StringArrayFromPtr(const char ** ptr);
Packit c32a2d

Packit c32a2d
#pragma endregion -Internal Helpers
Packit c32a2d

Packit c32a2d
#pragma region Error Handling
Packit c32a2d

Packit c32a2d
		// \defgroup mpg123_error mpg123 error handling
Packit c32a2d
		//
Packit c32a2d
		// Functions to get text version of the error numbers and an enumeration
Packit c32a2d
		// of the error codes returned by libmpg123.
Packit c32a2d
		//
Packit c32a2d
		// Most functions operating on a mpg123_handle simply return MPG123_OK on success and MPG123_ERR on failure (setting the internal error variable of the handle to the specific error code).
Packit c32a2d
		// Decoding/seek functions may also return message codes MPG123_DONE, MPG123_NEW_FORMAT and MPG123_NEED_MORE (please read up on these on how to react!).
Packit c32a2d
		// The positive range of return values is used for "useful" values when appropriate.
Packit c32a2d
		//
Packit c32a2d

Packit c32a2d
	public:
Packit c32a2d

Packit c32a2d
		///<summary>Get string describing what error has occured in the context of this object.
Packit c32a2d
		///<para>When a function operating on an mpg123 handle returns MPG123_ERR, you should use this function to check the actual reason.</para>
Packit c32a2d
		///<para>This function will catch mh == NULL and return the message for MPG123_BAD_HANDLE.</para>
Packit c32a2d
		///<para>Returns text representation of last error (incl. None) encountered by this object.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>Text representation of last error (incl. None) encountered by this object.</returns>
Packit c32a2d
		String^ __clrcall mpg123_strerror(void);
Packit c32a2d

Packit c32a2d
		///<summary>Get last error encountered in the context of this object.
Packit c32a2d
		///<para>When a function operating on an mpg123 handle returns MPG123_ERR, you should use this function to check the actual reason.</para>
Packit c32a2d
		///<para>This function will catch internal handle == NULL and return MPG123_BAD_HANDLE.</para>
Packit c32a2d
		///<para>Returns ErrorCode for last encountered error.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>The plain errcode intead of a string of last error (incl. None) encountered by this object.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_errcode(void);
Packit c32a2d

Packit c32a2d
#pragma endregion -Error Handling
Packit c32a2d

Packit c32a2d
#pragma region Decoder Selection
Packit c32a2d

Packit c32a2d
		// \defgroup mpg123_decoder mpg123 decoder selection
Packit c32a2d
		//
Packit c32a2d
		// Functions to list and select the available decoders.
Packit c32a2d
		// Perhaps the most prominent feature of mpg123: You have several (optimized) decoders to choose from (on x86 and PPC (MacOS) systems, that is).
Packit c32a2d
		//
Packit c32a2d

Packit c32a2d
	public:
Packit c32a2d

Packit c32a2d
		///<summary>Obtain list of generally available decoder names (plain 8bit ASCII).
Packit c32a2d
		///<para>Retuns a string array of generally available decoder names (plain 8bit ASCII).</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>A string array of generally available decoder names (plain 8bit ASCII).</returns>
Packit c32a2d
		array<String^>^ __clrcall mpg123_decoders(void);
Packit c32a2d

Packit c32a2d
		///<summary>Obtain list of the decoders supported by the CPU (plain 8bit ASCII).
Packit c32a2d
		///<para>Returns a string array of the decoders supported by the CPU (plain 8bit ASCII).</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>A string array of the decoders supported by the CPU (plain 8bit ASCII).</returns>
Packit c32a2d
		array<String^>^ __clrcall mpg123_supported_decoders(void);
Packit c32a2d

Packit c32a2d
		///<summary>Select the decoder to use.
Packit c32a2d
		///<para>Returns MPG123_OK or applicable error code.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="name">Name of the required decoder. (should be in SupportedDecoders list)</param>
Packit c32a2d
		///<returns>MPG123_OK or applicable error code.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_decoder(String^ name);
Packit c32a2d

Packit c32a2d
		///<summary>Get the currently active decoder engine name.
Packit c32a2d
		///<para>The active decoder engine can vary depening on output constraints, mostly non-resampling, integer output is accelerated via 3DNow and Co. 
Packit c32a2d
		/// but for other modes a fallback engine kicks in.</para>
Packit c32a2d
		///<para>Note that this can return a decoder that is ony active in the hidden and not available as decoder choice from the outside.</para>
Packit c32a2d
		///<para>Returns the decoder name or String.Empty on error.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>The decoder name or String.Empty on error.</returns>
Packit c32a2d
		String^ __clrcall mpg123_current_decoder(void);
Packit c32a2d

Packit c32a2d
#pragma endregion -Decoder Selection
Packit c32a2d

Packit c32a2d
#pragma region Output Audio Format
Packit c32a2d

Packit c32a2d
		// \defgroup mpg123_output mpg123 output audio format 
Packit c32a2d
		//
Packit c32a2d
		// Functions to get and select the format of the decoded audio.
Packit c32a2d
		//
Packit c32a2d

Packit c32a2d
	public:
Packit c32a2d

Packit c32a2d
		///<summary>Get an array of supported standard sample rates.
Packit c32a2d
		///<para>These are possible native sample rates of MPEG audio files.
Packit c32a2d
		/// You can still force mpg123 to resample to a different one, but by default you will only get audio in one of these samplings.</para>
Packit c32a2d
		///<para>Returns array of sample rates.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>An array of sample rates.</returns>
Packit c32a2d
		array<long>^ __clrcall mpg123_rates(void);
Packit c32a2d

Packit c32a2d
		///<summary>An array of supported audio encodings.
Packit c32a2d
		///<para>An audio encoding is one of the fully qualified members of mpg.enc</para>
Packit c32a2d
		///<para>Returns array of supported Encodings.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>An array of supported Encodings.</returns>
Packit c32a2d
		array<mpg123clr::mpg::enc>^ __clrcall mpg123_encodings(void);
Packit c32a2d

Packit c32a2d
		///<summary>Get the size (in bytes) of one mono sample of the named encoding.
Packit c32a2d
		///<para>Returns the positive size of encoding in bytes, 0 on invalid encoding.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="encoding">The encoding value to analyze.</param>
Packit c32a2d
		///<returns>The positive size of encoding in bytes, 0 on invalid encoding.</returns>
Packit c32a2d
		static int __clrcall mpg123_encsize(mpg123clr::mpg::enc encoding);
Packit c32a2d

Packit c32a2d
		///<summary>Configure mpg123 to accept no output format at all.
Packit c32a2d
		///<para>Use to clear default parameters prior to applying specific settings.</para>
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_format_none(void);
Packit c32a2d

Packit c32a2d
		///<summary>Configure mpg123 to accept all formats including any custom formats - this is the default.
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_format_all(void);
Packit c32a2d

Packit c32a2d
		///<summary>Configure detailed output formats.
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="rate">Sample rate (Hertz)</param>
Packit c32a2d
		///<param name="channels">Combination of channelcount.stereo and channelcount.mono</param>
Packit c32a2d
		///<param name="encodings">Combination of accepted encodings for rate and channels e.g. enc.enc_signed16 | enc.enc_ulaw_8 (or 0 for none)</param>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_format(int rate, mpg123clr::mpg::channelcount channels, mpg123clr::mpg::enc encodings);
Packit c32a2d

Packit c32a2d
		///<summary>Get available support for supplied rate and encoding.
Packit c32a2d
		///<para>Returns 0 for no support (includes invalid parameters), or combination of channelcount.stereo and channelcount.mono.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="rate">Sample rate (Hertz)</param>
Packit c32a2d
		///<param name="encoding">Combination of accepted encodings for rate and channels e.g. enc.enc_signed16 | enc.enc_ulaw_8 (or 0 for none)</param>
Packit c32a2d
		///<returns>Returns 0 for no support (includes invalid parameters), or combination of channelcount.stereo and channelcount.mono.</returns>
Packit c32a2d
		mpg123clr::mpg::channelcount __clrcall mpg123_format_support(int rate, mpg123clr::mpg::enc encoding);
Packit c32a2d

Packit c32a2d
		///<summary>Get current output format.
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="rate">Returns current sample rate (Hertz)</param>
Packit c32a2d
		///<param name="channels">Returns combination of channelcount.stereo and channelcount.mono</param>
Packit c32a2d
		///<param name="encoding">Returns combination of accepted encodings for rate and channels e.g. enc.enc_signed16 | enc.enc_ulaw_8 (or 0 for none)</param>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_getformat([Out] int% rate, [Out] mpg123clr::mpg::channelcount% channels, [Out] mpg123clr::mpg::enc% encoding);
Packit c32a2d

Packit c32a2d
#pragma endregion -Output Audio Format
Packit c32a2d

Packit c32a2d
#pragma region File Input and Decoding
Packit c32a2d

Packit c32a2d
		// \defgroup mpg123_input mpg123 file input and decoding
Packit c32a2d
		//
Packit c32a2d
		// Functions for input bitstream and decoding operations.
Packit c32a2d
		// Decoding/seek functions may also return message codes MPG123_DONE, MPG123_NEW_FORMAT and MPG123_NEED_MORE (please read up on these on how to react!).
Packit c32a2d
		//
Packit c32a2d

Packit c32a2d
	public:
Packit c32a2d

Packit c32a2d
		///<summary>Open and prepare to decode the file specified by ANSI filename.
Packit c32a2d
		///<para>This does not open HTTP urls; the mpg library contains no networking code.
Packit c32a2d
		/// If you want to decode internet streams, use Open(fd) or Open().</para>
Packit c32a2d
		///
Packit c32a2d
		///<para>Returns MPG123 error codes</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="path">ANSI file path. Accepts ANSI path characters. For Unicode paths use tOpen.
Packit c32a2d
		/// NOTE: can be used in Unicode environment as long as wide-char codepages are avoided.</param>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_open(String^ path);
Packit c32a2d

Packit c32a2d
		///<summary>Use a previously obtained file descriptor as the bitstream input.
Packit c32a2d
		///<para>NOTE: Close() will NOT close a file opened with this method.</para>
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="fd">File Descriptor of pre required file.</param>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_open_fd(int fd);
Packit c32a2d

Packit c32a2d
		///<summary>Use an opaque handle as bitstream input.
Packit c32a2d
		///<para>This works only with the replaced I/O from mpg123_replace_reader_handle()!</para>
Packit c32a2d
		///<para>mpg123_close() will call the cleanup callback for your handle (if you gave one).</para>
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_open_handle(System::Object^ obj);
Packit c32a2d

Packit c32a2d
		///<summary>Open a new bitstream and prepare for direct feeding.
Packit c32a2d
		///<para>This works together with Decode(); you are responsible for reading and feeding the input bitstream.</para>
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_open_feed(void);
Packit c32a2d

Packit c32a2d
		///<summary>Closes the source, if the library opened it.
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_close(void);
Packit c32a2d

Packit c32a2d
		///<summary>Open and prepare to decode the file specified by UNICODE (wide-character) filename.
Packit c32a2d
		///<para>This does not open HTTP urls; the mpg library contains no networking code.
Packit c32a2d
		/// If you want to decode internet streams, use Open(fd) or Open().</para>
Packit c32a2d
		///
Packit c32a2d
		///<para>Returns MPG123 error codes</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="path">UNICODE wide-character file path. See also ANSI Open(path).</param>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_topen(String^ path);
Packit c32a2d

Packit c32a2d
		///<summary>Closes the file opened with tOpen.
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_tclose(void);
Packit c32a2d

Packit c32a2d
		///<summary>Read from stream and decode.
Packit c32a2d
		///<para>Equivalent to mpg123_read(,,,)</para>
Packit c32a2d
		///<para>Returns MPG123 error codes. (watch out for MPG123_DONE and friends!)</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="buffer">Supplied buffer in which to return audio output data.</param>
Packit c32a2d
		///<param name="count">Returns number of actual audio output bytes returned.</param>
Packit c32a2d
		///<returns>MPG123 error codes. (watch out for MPG123_DONE and friends!)</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_read(array<unsigned char>^ buffer, [Out] size_t% count);
Packit c32a2d

Packit c32a2d
		///<summary>Read from stream and decode.
Packit c32a2d
		///<para>Equivalent to mpg123_read(,,,) but modified to better support CLR Stream.Read</para>
Packit c32a2d
		///<para>Returns MPG123 error codes. (watch out for MPG123_DONE and friends!)</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="buffer">Supplied buffer in which to return audio output data.</param>
Packit c32a2d
		///<param name="offset">Offset in buffer at which to begin storing data.</param>
Packit c32a2d
		///<param name="size">Maximum number of bytes to return.</param>
Packit c32a2d
		///<param name="count">Returns number of actual audio output bytes returned.</param>
Packit c32a2d
		///<returns>MPG123 error codes. (watch out for MPG123_DONE and friends!)</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_read(array<unsigned char>^ buffer, size_t offset, size_t size, [Out] size_t% count);
Packit c32a2d

Packit c32a2d
		///<summary>Feed data for a stream that has been opened with Open() - (mpg123_open_feed).
Packit c32a2d
		///<para>Equivalent to mpg123_feed(...), it's give and take: You provide the bytestream, mpg123 gives you the decoded samples.</para>
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="inbuffer">Input buffer.</param>
Packit c32a2d
		///<param name="size">Number of input bytes.</param>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_feed(array<unsigned char>^ inbuffer, size_t size);
Packit c32a2d

Packit c32a2d
		///<summary>Decode MPEG Audio from inmemory to outmemory.
Packit c32a2d
		///<para>This is very close to a drop-in replacement for old mpglib.</para>
Packit c32a2d
		///<para>When you give zero-sized output buffer the input will be parsed until 
Packit c32a2d
		/// decoded data is available. This enables you to get MPG123_NEW_FORMAT (and query it) 
Packit c32a2d
		/// without taking decoded data.</para>
Packit c32a2d
		///<para>Think of this function being the union of Read() and Feed() (which it actually is, sort of;-).
Packit c32a2d
		/// You can actually always decide if you want those specialized functions in separate steps or one call this one here.</para>
Packit c32a2d
		///<para>Returns MPG123 error codes. (watch out especially for MPG123_NEED_MORE)</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="inbuffer">Input buffer.</param>
Packit c32a2d
		///<param name="insize">Number of input bytes.</param>
Packit c32a2d
		///<param name="outbuffer">Supplied buffer in which to return audio output data.</param>
Packit c32a2d
		///<param name="outsize">Size in bytes of buffer.</param>
Packit c32a2d
		///<param name="count">Returns number of actual audio output bytes returned.</param>
Packit c32a2d
		///<returns>MPG123 error codes. (watch out especially for MPG123_NEED_MORE)</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_decode(array<unsigned char>^ inbuffer, size_t insize, array<unsigned char>^ outbuffer, size_t outsize, [Out] size_t% count);
Packit c32a2d

Packit c32a2d
		///<summary>Decode next MPEG frame to internal buffer or read a frame and return after setting a new format.
Packit c32a2d
		///<para>Returns MPG123 error codes. (watch out for MPG123_NEW_FORMAT)</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="num">Returns current frame offset.</param>
Packit c32a2d
		///<param name="audio">Returns pointer to internal buffer to read the decoded audio from. (Can be NULL for NEW_FORMAT)</param>
Packit c32a2d
		///<param name="count">Returns number of actual audio output bytes ready in the buffer.</param>
Packit c32a2d
		///<returns>MPG123 error codes. (watch out for MPG123_NEW_FORMAT)</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_decode_frame([Out] off_t% num, [Out] IntPtr% audio, [Out] size_t% count);
Packit c32a2d

Packit c32a2d
		///<summary>Decode current MPEG frame to internal buffer.
Packit c32a2d
		///<para>Use with mpg123_framebyframe_next to progress through data.</para>
Packit c32a2d
		///<para>Warning: This is experimental API that might change in future releases!
Packit c32a2d
		/// Please watch mpg123 development closely when using it.</para>
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="num">Returns current frame offset.</param>
Packit c32a2d
		///<param name="audio">Returns pointer to internal buffer to read the decoded audio from. (Can be NULL for NEW_FORMAT)</param>
Packit c32a2d
		///<param name="bytes">Returns number of actual audio output bytes ready in the buffer.</param>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_framebyframe_decode([Out] off_t% num, [Out] IntPtr% audio, [Out] size_t% bytes);
Packit c32a2d

Packit c32a2d
		///<summary>Find, read and parse the next mp3 frame.
Packit c32a2d
		///<para>Use with mpg123_framebyframe_decode to obtain frame data.</para>
Packit c32a2d
		///<para>Warning: This is experimental API that might change in future releases!
Packit c32a2d
		/// Please watch mpg123 development closely when using it.</para>
Packit c32a2d
		///<para>Returns MPG123 error codes. (watch out for MPG123_NEW_FORMAT)</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>MPG123 error codes. (watch out for MPG123_NEW_FORMAT)</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_framebyframe_next(void);
Packit c32a2d

Packit c32a2d
#pragma endregion -File Input and Decoding
Packit c32a2d

Packit c32a2d
#pragma region Position and Seeking
Packit c32a2d

Packit c32a2d
		// \defgroup mpg123_seek mpg123 position and seeking
Packit c32a2d
		//
Packit c32a2d
		// Functions querying and manipulating position in the decoded audio bitstream.
Packit c32a2d
		// The position is measured in decoded audio samples, or MPEG frame offset for the specific functions.
Packit c32a2d
		// If gapless code is in effect, the positions are adjusted to compensate the skipped padding/delay - meaning, you should not care about that at all and just use the position defined for the samples you get out of the decoder;-)
Packit c32a2d
		// The general usage is modelled after stdlib's ftell() and fseek().
Packit c32a2d
		// Especially, the whence parameter for the seek functions has the same meaning as the one for fseek() and needs the same constants from stdlib.h: 
Packit c32a2d
		// - SEEK_SET: set position to (or near to) specified offset
Packit c32a2d
		// - SEEK_CUR: change position by offset from now
Packit c32a2d
		// - SEEK_END: set position to offset from end
Packit c32a2d
		//
Packit c32a2d
		// Note that sample-accurate seek only works when gapless support has been enabled at compile time; seek is frame-accurate otherwise.
Packit c32a2d
		// Also, really sample-accurate seeking (meaning that you get the identical sample value after seeking compared to plain decoding up to the position) is only guaranteed when you do not mess with the position code by using MPG123_UPSPEED, MPG123_DOWNSPEED or MPG123_START_FRAME. The first two mainly should cause trouble with NtoM resampling, but in any case with these options in effect, you have to keep in mind that the sample offset is not the same as counting the samples you get from decoding since mpg123 counts the skipped samples, too (or the samples played twice only once)!
Packit c32a2d
		// Short: When you care about the sample position, don't mess with those parameters;-)
Packit c32a2d
		// Also, seeking is not guaranteed to work for all streams (underlying stream may not support it).
Packit c32a2d
		//
Packit c32a2d

Packit c32a2d
	public:
Packit c32a2d

Packit c32a2d
		///<summary>Get the current position in samples. On the next read, you'd get that sample.
Packit c32a2d
		///<para>Returns the current sample position.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>The current sample position.</returns>
Packit c32a2d
		long long __clrcall mpg123_tell();
Packit c32a2d

Packit c32a2d
		///<summary>Get the frame number that the next read will give you data from.
Packit c32a2d
		///<para>Returns the current frame number position.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>The current frame number position.</returns>
Packit c32a2d
		long long __clrcall mpg123_tellframe();
Packit c32a2d

Packit c32a2d
		///<summary>Get the current byte offset in the input stream.
Packit c32a2d
		///<para>Returns the current byte offset.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>The current byte offset.</returns>
Packit c32a2d
		long long __clrcall mpg123_tell_stream();
Packit c32a2d

Packit c32a2d
		///<summary>Seek to a desired sample offset.
Packit c32a2d
		///<para>Returns the resulting offset >= 0 or error/message code.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="offset">The distance to move.</param>
Packit c32a2d
		///<param name="origin">(whence) The relative location to move from.(SeekOrigin.Begin, SeekOrigin.Current, SeekOrigin.End)</param>
Packit c32a2d
		///<returns>Returns the resulting offset >= 0 or error/message code.</returns>
Packit c32a2d
		long long __clrcall mpg123_seek(long long offset, SeekOrigin origin);
Packit c32a2d

Packit c32a2d
		///<summary>Seek to a desired sample offset in data feeding mode.
Packit c32a2d
		///<para>This just prepares things to be right only if you ensure that the next chunk of input data will be from input_offset byte position.</para>
Packit c32a2d
		///<para>Returns the resulting offset >= 0 or error/message code.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="offset">The distance to move.</param>
Packit c32a2d
		///<param name="origin">(whence) The relative location to move from.(SeekOrigin.Begin, SeekOrigin.Current, SeekOrigin.End)</param>
Packit c32a2d
		///<param name="input_offset">Returns the position it expects to be at the next time data is fed to Decode().</param>
Packit c32a2d
		///<returns>Returns the resulting offset >= 0 or error/message code.</returns>
Packit c32a2d
		long long __clrcall mpg123_feedseek(long long offset, SeekOrigin origin, [Out] long long% input_offset);
Packit c32a2d

Packit c32a2d
		///<summary>Seek to a desired MPEG frame index.
Packit c32a2d
		///<para>Returns the resulting offset >= 0 or error/message code.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="frameoffset">The numberof frames to move.</param>
Packit c32a2d
		///<param name="origin">(whence) The relative location to move from.(SEEK_SET, SEEK_CUR or SEEK_END)</param>
Packit c32a2d
		///<returns>Returns the resulting offset >= 0 or error/message code.</returns>
Packit c32a2d
		long long __clrcall mpg123_seek_frame(long long frameoffset, SeekOrigin origin);
Packit c32a2d

Packit c32a2d
		///<summary>Seek to an absolute MPEG frame offset corresponding to an offset in seconds.
Packit c32a2d
		///<para>This assumes that the samples per frame do not change in the file/stream, which is a good assumption for any sane file/stream only.</para>
Packit c32a2d
		///<para>Returns the resulting offset >= 0 or error/message code.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="seconds">The absolute time offset required.</param>
Packit c32a2d
		///<returns>Returns the resulting offset >= 0 or error/message code.</returns>
Packit c32a2d
		long long __clrcall mpg123_timeframe(double seconds);
Packit c32a2d

Packit c32a2d
		///<summary>Get a copy of the frame index table. Somewhat equivalent to mpg123_index(,,).
Packit c32a2d
		///<para>The library requests not to modify table values. Since this is a copy, modification is meaningless - it has no effect on library routines.</para>
Packit c32a2d
		///<para>NOTE: The returned index table value types are Int64 independant of library build.</para>
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="index">Returns array of source file position offsets (not output samples). Length of array is equivalent to mpg123_index "fill" parameter.</param>
Packit c32a2d
		///<param name="step">Returns number of MPEG frames per index entry.</param>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_index([Out] array<long long>^% index, [Out] long long% step);
Packit c32a2d

Packit c32a2d
		///<summary>Get a pointer to the frame index table. Equivalent to mpg123_index(,,).
Packit c32a2d
		///<para>Do not modify table values unless you really know what you are doing!</para>
Packit c32a2d
		///<para>NOTE: The returned index table value types may be Int32 or Int64 depending on library build.</para>
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="indexarr">Returns pointer to source file position offset index array (not output samples).</param>
Packit c32a2d
		///<param name="step">Returns number of MPEG frames per index entry.</param>
Packit c32a2d
		///<param name="fill">Returns number of recorded index offsets; size of the array.</param>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_index([Out] IntPtr% indexarr, [Out] long long% step, [Out] size_t% fill);
Packit c32a2d

Packit c32a2d
		///<summary>Get information about current and remaining frames/seconds. Equivalent to mpg123_position(,,,,,,).
Packit c32a2d
		///<para>WARNING: This function is there because of special usage by standalone mpg123 and may be removed in the final version of libmpg123!</para>
Packit c32a2d
		///<para>You provide an offset (in frames) from now and a number of output bytes 
Packit c32a2d
		/// served by libmpg123 but not yet played. You get the projected current frame 
Packit c32a2d
		/// and seconds, as well as the remaining frames/seconds. This does _not_ care 
Packit c32a2d
		/// about skipped samples due to gapless playback.</para>
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="frameoffset">Offset (in frames) from now.</param>
Packit c32a2d
		///<param name="bufferedbytes">Number of output bytes served by library but not yet played.</param>
Packit c32a2d
		///<param name="currentframe">Returns projected current frame.</param>
Packit c32a2d
		///<param name="framesleft">Returns projected frames remaining.</param>
Packit c32a2d
		///<param name="currentseconds">Returns projected current seconds.</param>
Packit c32a2d
		///<param name="secondsleft">Returns projected seconds remaining.</param>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_position(long long frameoffset, long long bufferedbytes, 
Packit c32a2d
			[Out] long long% currentframe, [Out] long long% framesleft,
Packit c32a2d
			[Out] double% currentseconds, [Out] double% secondsleft);
Packit c32a2d

Packit c32a2d
#pragma endregion -Position and Seeking
Packit c32a2d

Packit c32a2d
#pragma region Volume and Equalizer
Packit c32a2d

Packit c32a2d
		// \defgroup mpg123_voleq mpg123 volume and equalizer
Packit c32a2d
		//
Packit c32a2d

Packit c32a2d
	public:
Packit c32a2d

Packit c32a2d
		///<summary>Set the 32 Band Audio Equalizer settings.
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="channel">Can be MPG123_LEFT, MPG123_RIGHT or MPG123_LEFT|MPG123_RIGHT for both. (enum mpg.channels)</param>
Packit c32a2d
		///<param name ="band">The equaliser band to change (from 0 to 31)</param>
Packit c32a2d
		///<param name="fval">The (linear) adjustment factor to be applied.</param>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_eq(mpg123clr::mpg::channels channel, int band, double fval);
Packit c32a2d

Packit c32a2d
		///<summary>Get the 32 Band Audio Equalizer settings.
Packit c32a2d
		///<para>Rreturns the (linear) adjustment factor.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="channel">Can be MPG123_LEFT, MPG123_RIGHT or MPG123_LEFT|MPG123_RIGHT for (arithmetic mean of) both. (enum mpg.channels)</param>
Packit c32a2d
		///<param name="band">The equaliser band to get (from 0 to 31)</param>
Packit c32a2d
		///<return>The (linear) adjustment factor.</return>
Packit c32a2d
		double __clrcall mpg123_geteq(mpg123clr::mpg::channels channel, int band);
Packit c32a2d

Packit c32a2d
		///<summary>Reset the 32 Band Audio Equalizer settings to flat.
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_reset_eq();
Packit c32a2d

Packit c32a2d
		///<summary>Set the absolute output volume including the RVA setting.
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="volume">The (linear) adjustment factor to be applied, volume < 0 just applies (a possibly changed) RVA setting.</param>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_volume(double volume);
Packit c32a2d

Packit c32a2d
		///<summary>Adjust output volume including the RVA setting.
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="change">The (linear) adjustment factor to be applied.</param>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_volume_change(double change);
Packit c32a2d

Packit c32a2d
		///<summary>Get the current volume setting, the actual value due to RVA, and the RVA adjustment itself.
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="basevol">Returns the current linear volume factor. (not percent)</param>
Packit c32a2d
		///<param name="really">Returns the actual linear volume factor due to RVA. (not percent)</param>
Packit c32a2d
		///<param name="rva_db">Returns the RVA adjustment in decibels.</param>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_getvolume([Out] double% basevol, [Out] double% really, [Out] double% rva_db);
Packit c32a2d

Packit c32a2d
#pragma endregion -Volume and Equalizer
Packit c32a2d

Packit c32a2d
#pragma region Status and Information
Packit c32a2d

Packit c32a2d
		// \defgroup mpg123_status mpg123 status and information
Packit c32a2d
		//
Packit c32a2d
		//
Packit c32a2d
		//
Packit c32a2d

Packit c32a2d
		[StructLayout(LayoutKind::Sequential, CharSet=CharSet::Ansi, Pack=1)]
Packit c32a2d
		ref struct mpeg_frameinfo
Packit c32a2d
		{
Packit c32a2d
			mpg123clr::mpg::mpeg_version version;	// The MPEG version (1.0/2.0/2.5).
Packit c32a2d
			int layer;								// The MPEG Audio Layer (MP1/MP2/MP3).
Packit c32a2d
			long rate; 								// The sampling rate in Hz.
Packit c32a2d
			mpg123clr::mpg::mpeg_mode mode;			// The audio mode (Mono, Stereo, Joint-stero, Dual Channel).
Packit c32a2d
			int mode_ext;							// The mode extension bit flag.
Packit c32a2d
			int framesize;							// The size of the frame (in bytes).
Packit c32a2d
			mpg123clr::mpg::mpeg_flags flags;		// MPEG Audio flag bits.
Packit c32a2d
			int emphasis;							// The emphasis type.
Packit c32a2d
			int bitrate;							// Bitrate of the frame (kbps).
Packit c32a2d
			int abr_rate;							// The target average bitrate.
Packit c32a2d
			mpg123clr::mpg::mpeg_vbr vbr;			// The VBR mode.
Packit c32a2d
		};
Packit c32a2d

Packit c32a2d
		///<summary>Get the frame information about the MPEG audio bitstream.
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="finfo">Returns the frame information.</param>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_info([Out]mpeg_frameinfo^% finfo);
Packit c32a2d

Packit c32a2d
		///<summary>Get the frame information about the MPEG audio bitstream.
Packit c32a2d
		///<para>SafeInfo uses "safe" managed structures but is somewhat slower than Info().
Packit c32a2d
		/// Recommend using Info() unless it gives specific problems.</para>
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="finfo">Returns the frame information.</param>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_safeinfo([Out]mpeg_frameinfo^% finfo);
Packit c32a2d

Packit c32a2d
		///<summary>Get the safe output buffer size for all cases (when you want to replace the internal buffer).
Packit c32a2d
		///<para>Returns safe buffer size.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>Safe buffer size.</returns>
Packit c32a2d
		static size_t __clrcall mpg123_safe_buffer(void);
Packit c32a2d

Packit c32a2d
		///<summary>Make a full parsing scan of each frame in the file. 
Packit c32a2d
		///<para>ID3 tags are found. An accurate length value is stored. Seek index will be filled. 
Packit c32a2d
		/// A seek back to current position is performed.</para>
Packit c32a2d
		///<para>This function refuses work when stream is not seekable.</para>
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_scan(void);
Packit c32a2d

Packit c32a2d
		///<summary>Return, if possible, the full (expected) length of current track in samples.
Packit c32a2d
		///<para>Returns length (>= 0) or MPG123_ERR if there is no length guess possible. (Multiply by BlockAlign for byte-count)</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>Length (>= 0) or MPG123_ERR if there is no length guess possible. (Multiply by BlockAlign for byte-count)</returns>
Packit c32a2d
		long long __clrcall mpg123_length(void);
Packit c32a2d

Packit c32a2d
		///<summary>Override the value for file size in bytes.
Packit c32a2d
		///<para>Useful for getting sensible track length values in feed mode or for HTTP streams.</para>
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="size">Size to set.</param>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_set_filesize(long long size);
Packit c32a2d

Packit c32a2d
		///<summary>Time Per Frame (seconds).
Packit c32a2d
		///<para>Returns time per frame in seconds ( < 0 is error ).</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>Time per frame in seconds ( < 0 is error ).</returns>
Packit c32a2d
		double __clrcall mpg123_tpf(void);
Packit c32a2d

Packit c32a2d
		///<summary>Get and reset the clip count.
Packit c32a2d
		///<para>Returns the number of previously encountered clips.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>The number of previously encountered clips.</returns>
Packit c32a2d
		long __clrcall mpg123_clip();
Packit c32a2d

Packit c32a2d
		///<summary>Get various current decoder/stream state information.
Packit c32a2d
		///<para>Returns MPG123 error codes.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="key">The key to identify the information to get (enum mpg.state).</param>
Packit c32a2d
		///<param name="val">Returns integer values.</param>
Packit c32a2d
		///<param name="fval">Returns real values.</param>
Packit c32a2d
		///<returns>MPG123 error codes.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_getstate(mpg123clr::mpg::state key, [Out] int% val, [Out] double% fval);
Packit c32a2d

Packit c32a2d
#pragma endregion -Status and Information
Packit c32a2d

Packit c32a2d
#pragma region Metadata Handling
Packit c32a2d

Packit c32a2d
		// \defgroup mpg123_metadata mpg123 metadata handling
Packit c32a2d
		//
Packit c32a2d
		// Functions to retrieve the metadata from MPEG Audio files and streams.
Packit c32a2d
		// Also includes string handling functions.
Packit c32a2d
		//
Packit c32a2d

Packit c32a2d
		// clr - much of the metadata has been relocated to class files for maintainability
Packit c32a2d
		//       see string.h, text.h, id3v1.h and id3v2.h										
Packit c32a2d
		//
Packit c32a2d

Packit c32a2d
		///<summary>Query if there is (new) meta info, be it ID3 or ICY (or something new in future).
Packit c32a2d
		///<para>Returns a combination of flags. (enum id3.id3check)</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>Returns a combination of flags. (enum id3.id3check)</returns>
Packit c32a2d
		mpg123clr::id3::id3check __clrcall mpg123_meta_check(void); /* On error (no valid handle) just 0 is returned. */
Packit c32a2d

Packit c32a2d
		///<summary>Get ID3 data. Data structures may change on any (next) read/decode function call.
Packit c32a2d
		///<para>v1 and/or v2 may be Empty if no corresponding data exists.</para>
Packit c32a2d
		///<para>Returns MPG123_OK or MPG123_ERR.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="v1">Returns mpg123id3v1 data structure containing ID3v1 data (usually from end of file).</param>
Packit c32a2d
		///<param name="v2">Returns mpg123id3v2 data structure containing ID3v2 data (usually - but not restricted to - from beginning of file).</param>
Packit c32a2d
		///<returns>Returns MPG123_OK or MPG123_ERR.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_id3([Out]id3::mpg123id3v1^% v1, [Out]id3::mpg123id3v2^% v2);
Packit c32a2d

Packit c32a2d
		///<summary>Get ICY meta data. Data structure may change on any (next) read/decode function call.
Packit c32a2d
		///<para>Icy_meta may be null if no corresponding data exists.</para>
Packit c32a2d
		///<para>Returns MPG123_OK or MPG123_ERR.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="icy_meta">Returns ICY meta data (windows-1252 encoded).</param>
Packit c32a2d
		///<returns>Returns MPG123_OK or MPG123_ERR.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_icy([Out]IntPtr% icy_meta); /* same for ICY meta string */
Packit c32a2d

Packit c32a2d
		///<summary>Decode from windows-1252 (the encoding ICY metainfo used) to UTF-8.
Packit c32a2d
		///<para>Returns byte array of utf8 encoded data.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="icy_text">ICY meta data in ICY encoding.</param>
Packit c32a2d
		///<returns>Returns byte array of utf8 encoded data.</returns>
Packit c32a2d
		static array<unsigned char>^ __clrcall mpg123_icy2utf8(IntPtr icy_text);
Packit c32a2d

Packit c32a2d
#pragma endregion -Metadata Handling
Packit c32a2d

Packit c32a2d
#pragma region Advanced Parameter API
Packit c32a2d

Packit c32a2d
		// \defgroup mpg123_advpar mpg123 advanced parameter API
Packit c32a2d
		//
Packit c32a2d
		// Direct access to a parameter set without full handle around it.
Packit c32a2d
		// Possible uses:
Packit c32a2d
		//  - Influence behaviour of library _during_ initialization of handle (MPG123_VERBOSE).
Packit c32a2d
		//  - Use one set of parameters for multiple handles.
Packit c32a2d
		//
Packit c32a2d
		// The functions for handling mpg123_pars (mpg123_par() and mpg123_fmt() 
Packit c32a2d
		//  family) directly return a fully qualified mpg123 error code, the ones 
Packit c32a2d
		//  operating on full handles normally MPG123_OK or MPG123_ERR, storing the 
Packit c32a2d
		//  specific error code itself inside the handle. 
Packit c32a2d
		//
Packit c32a2d

Packit c32a2d
		// see advanced.h
Packit c32a2d

Packit c32a2d
#pragma endregion -Advanced Parameter API
Packit c32a2d

Packit c32a2d
#pragma region Low Level I/O
Packit c32a2d

Packit c32a2d
		// \defgroup mpg123_lowio mpg123 low level I/O
Packit c32a2d
		// You may want to do tricky stuff with I/O that does not work with mpg123's default file access or you want to make it decode into your own pocket...
Packit c32a2d
		//
Packit c32a2d

Packit c32a2d
		///<summary>Replace default internal buffer with user-supplied buffer.
Packit c32a2d
		///<para>Instead of working on it's own private buffer, mpg123 will directly use the one you provide for storing decoded audio.</para>
Packit c32a2d
		///<para>The data buffer should be pinned before calling this function.</para>
Packit c32a2d
		///<para>Returns MPG123_OK or MPG123 error code.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="data">Pointer to supplied buffer.</param>
Packit c32a2d
		///<param name="size">Size of supplied buffer.</param>
Packit c32a2d
		///<returns>MPG123_OK or MPG123_ERR code.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_replace_buffer(IntPtr data, size_t size);
Packit c32a2d

Packit c32a2d
		///<summary>The max size of one frame's decoded output with current settings.
Packit c32a2d
		///<para>Use that to determine an appropriate minimum buffer size for decoding one frame.</para>
Packit c32a2d
		///<para>Returns size of required buffer.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<returns>Size of required buffer.</returns>
Packit c32a2d
		size_t __clrcall mpg123_outblock(void);
Packit c32a2d

Packit c32a2d
		///<summary>Replace low-level stream access functions; read and lseek as known in POSIX.
Packit c32a2d
		///<para>You can use this to make any fancy file opening/closing yourself, 
Packit c32a2d
		/// using mpg123_open_fd() to set the file descriptor for your read/lseek (doesn't need to be a 'real' file descriptor...).</para>
Packit c32a2d
		///<para>Setting a function to NULL means that the default internal function is used (active from next Open call onward).</para>
Packit c32a2d
		/////////////////////////
Packit c32a2d
		///<para>Always returns MPG123_OK.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="r_read">Delegate for read function, null for default.</param>
Packit c32a2d
		///<param name="r_lseek">Delegate for lseek function, null for default.</param>
Packit c32a2d
		///<returns>Always MPG123_OK.</returns>
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_replace_reader(ReadDelegate^ r_read, SeekDelegate^ r_lseek);
Packit c32a2d

Packit c32a2d
		///////////////////////////////////////
Packit c32a2d
		mpg123clr::mpg::ErrorCode __clrcall mpg123_replace_reader_handle(ReadHandleDelegate^ rh_read, SeekHandleDelegate^ rh_lseek, CleanupHandleDelegate^ rh_clean);
Packit c32a2d

Packit c32a2d
	private:
Packit c32a2d

Packit c32a2d
		// Defered internal implementation of ReplaceReader - action is defered until next 'Open' operation.
Packit c32a2d
		void __clrcall _ReplaceReader(void);
Packit c32a2d

Packit c32a2d
	public:
Packit c32a2d

Packit c32a2d
		// These functions are not part of the mpg123clr wrapper but are included as proof of concept
Packit c32a2d
		// of how to implement callback functions.
Packit c32a2d

Packit c32a2d
		///<summary>Proof of concept posix-like lseek function.
Packit c32a2d
		///<para>This routine should not normally be called from your callback routine, it is a sample function
Packit c32a2d
		/// showing how such a callback could be implemented.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="fd">File descriptor.</param>
Packit c32a2d
		///<param name="offset">Required position.</param>
Packit c32a2d
		///<param name="origin">Whence.</param>
Packit c32a2d
		///<returns>Resultant position.</returns>
Packit c32a2d
		static long PosixSeek(int fd, long offset, int origin)
Packit c32a2d
		{
Packit c32a2d
			long ret =  _lseek(fd, offset, origin);
Packit c32a2d
			return ret;
Packit c32a2d
		}
Packit c32a2d

Packit c32a2d
		///<summary>Proof of concept posix-like read function.
Packit c32a2d
		///<para>This routine should not normally be called from your callback routine, it is a sample function
Packit c32a2d
		/// showing how such a callback could be implemented.</para>
Packit c32a2d
		///</summary>
Packit c32a2d
		///<param name="fd">File descriptor.</param>
Packit c32a2d
		///<param name="buf">Buffer address.</param>
Packit c32a2d
		///<param name="count">Size of buffer.</param>
Packit c32a2d
		///<returns>Actual bytes read.</returns>
Packit c32a2d
		static int PosixRead(int fd, void*buf, unsigned int count)
Packit c32a2d
		{
Packit c32a2d
			int ret = _read(fd, buf, count);
Packit c32a2d
			return ret;
Packit c32a2d
		}
Packit c32a2d

Packit c32a2d
#pragma endregion -Low Level I/O
Packit c32a2d

Packit c32a2d
	};
Packit c32a2d

Packit c32a2d
}