using System;
using System.Runtime.InteropServices;
namespace CUETools.Codecs.LAME.Interop
{
///
/// Lame_enc DLL functions
///
public class Lame_encDll
{
//Error codes
public const uint BE_ERR_SUCCESSFUL = 0;
public const uint BE_ERR_INVALID_FORMAT = 1;
public const uint BE_ERR_INVALID_FORMAT_PARAMETERS = 2;
public const uint BE_ERR_NO_MORE_HANDLES = 3;
public const uint BE_ERR_INVALID_HANDLE = 4;
///
/// This function is the first to call before starting an encoding stream.
///
/// Encoder settings
/// Receives the number of samples (not bytes, each sample is a SHORT) to send to each beEncodeChunk() on return.
/// Receives the minimun number of bytes that must have the output(result) buffer
/// Receives the stream handle on return
/// On success: BE_ERR_SUCCESSFUL
[DllImport("Lame_enc.dll")]
public static extern uint beInitStream(BE_CONFIG pbeConfig, ref uint dwSamples, ref uint dwBufferSize, ref uint phbeStream);
///
/// Encodes a chunk of samples. Please note that if you have set the output to
/// generate mono MP3 files you must feed beEncodeChunk() with mono samples
///
/// Handle of the stream.
/// Number of samples to be encoded for this call.
/// This should be identical to what is returned by beInitStream(),
/// unless you are encoding the last chunk, which might be smaller.
/// Array of 16-bit signed samples to be encoded.
/// These should be in stereo when encoding a stereo MP3
/// and mono when encoding a mono MP3
/// Buffer where to write the encoded data.
/// This buffer should be at least of the minimum size returned by beInitStream().
/// Returns the number of bytes of encoded data written.
/// The amount of data written might vary from chunk to chunk
/// On success: BE_ERR_SUCCESSFUL
[DllImport("Lame_enc.dll")]
public static extern uint beEncodeChunk(uint hbeStream, uint nSamples, short[] pInSamples, [In, Out] byte[] pOutput, ref uint pdwOutput);
///
/// Encodes a chunk of samples. Please note that if you have set the output to
/// generate mono MP3 files you must feed beEncodeChunk() with mono samples
///
/// Handle of the stream.
/// Number of samples to be encoded for this call.
/// This should be identical to what is returned by beInitStream(),
/// unless you are encoding the last chunk, which might be smaller.
/// Pointer at the 16-bit signed samples to be encoded.
/// InPtr is used to pass any type of array without need of make memory copy,
/// then gaining in performance. Note that nSamples is not the number of bytes,
/// but samples (is sample is a SHORT)
/// Buffer where to write the encoded data.
/// This buffer should be at least of the minimum size returned by beInitStream().
/// Returns the number of bytes of encoded data written.
/// The amount of data written might vary from chunk to chunk
/// On success: BE_ERR_SUCCESSFUL
[DllImport("Lame_enc.dll")]
protected static extern uint beEncodeChunk(uint hbeStream, uint nSamples, IntPtr pSamples, IntPtr pOutput, ref uint pdwOutput);
///
/// Encodes a chunk of samples. Samples are contained in a byte array
///
/// Handle of the stream.
/// Bytes to encode
/// Position of the first byte to encode
/// Number of bytes to encode (not samples, samples are two byte lenght)
/// Buffer where to write the encoded data.
/// This buffer should be at least of the minimum size returned by beInitStream().
/// Returns the number of bytes of encoded data written.
/// The amount of data written might vary from chunk to chunk
/// On success: BE_ERR_SUCCESSFUL
public static unsafe uint EncodeChunk(uint hbeStream, byte* pSamples, uint nBytes, byte* pOutput, ref uint pdwOutput)
{
return beEncodeChunk(hbeStream, nBytes / 2/*Samples*/, (IntPtr)pSamples, (IntPtr)pOutput, ref pdwOutput);
}
///
/// Encodes a chunk of samples. Samples are contained in a byte array
///
/// Handle of the stream.
/// Bytes to encode
/// Position of the first byte to encode
/// Number of bytes to encode (not samples, samples are two byte lenght)
/// Buffer where to write the encoded data.
/// This buffer should be at least of the minimum size returned by beInitStream().
/// Returns the number of bytes of encoded data written.
/// The amount of data written might vary from chunk to chunk
/// On success: BE_ERR_SUCCESSFUL
public static unsafe uint EncodeChunk(uint hbeStream, byte[] Samples, int index, uint nBytes, byte[] Output, ref uint pdwOutput)
{
fixed (byte* pSamples = &Samples[index], pOutput = Output)
return beEncodeChunk(hbeStream, nBytes / 2/*Samples*/, (IntPtr)pSamples, (IntPtr)pOutput, ref pdwOutput);
}
///
/// Encodes a chunk of samples. Samples are contained in a byte array
///
/// Handle of the stream.
/// Bytes to encode
/// Buffer where to write the encoded data.
/// This buffer should be at least of the minimum size returned by beInitStream().
/// Returns the number of bytes of encoded data written.
/// The amount of data written might vary from chunk to chunk
/// On success: BE_ERR_SUCCESSFUL
public static uint EncodeChunk(uint hbeStream, byte[] buffer, byte[] pOutput, ref uint pdwOutput)
{
return EncodeChunk(hbeStream, buffer, 0, (uint)buffer.Length, pOutput, ref pdwOutput);
}
///
/// This function should be called after encoding the last chunk in order to flush
/// the encoder. It writes any encoded data that still might be left inside the
/// encoder to the output buffer. This function should NOT be called unless
/// you have encoded all of the chunks in your stream.
///
/// Handle of the stream.
/// Where to write the encoded data. This buffer should be
/// at least of the minimum size returned by beInitStream().
/// Returns number of bytes of encoded data written.
/// On success: BE_ERR_SUCCESSFUL
[DllImport("Lame_enc.dll")]
public static extern uint beDeinitStream(uint hbeStream, [In, Out] byte[] pOutput, ref uint pdwOutput);
///
/// Last function to be called when finished encoding a stream.
/// Should unlike beDeinitStream() also be called if the encoding is canceled.
///
/// Handle of the stream.
/// On success: BE_ERR_SUCCESSFUL
[DllImport("Lame_enc.dll")]
public static extern uint beCloseStream(uint hbeStream);
///
/// Returns information like version numbers (both of the DLL and encoding engine),
/// release date and URL for lame_enc's homepage.
/// All this information should be made available to the user of your product
/// through a dialog box or something similar.
///
///
[DllImport("Lame_enc.dll")]
public static extern void beVersion([Out] BE_VERSION pbeVersion);
[DllImport("Lame_enc.dll", CharSet = CharSet.Ansi)]
public static extern void beWriteVBRHeader(string pszMP3FileName);
[DllImport("Lame_enc.dll")]
public static extern uint beEncodeChunkFloatS16NI(uint hbeStream, uint nSamples, [In]float[] buffer_l, [In]float[] buffer_r, [In, Out]byte[] pOutput, ref uint pdwOutput);
[DllImport("Lame_enc.dll")]
public static extern uint beFlushNoGap(uint hbeStream, [In, Out]byte[] pOutput, ref uint pdwOutput);
[DllImport("Lame_enc.dll", CharSet = CharSet.Ansi)]
public static extern uint beWriteInfoTag(uint hbeStream, string lpszFileName);
}
}