Files
cuetools.net/CUETools.Codecs.libFLAC/libFLAC.cs

222 lines
7.4 KiB
C#

using System;
using System.Runtime.InteropServices;
namespace CUETools.Codecs.libFLAC
{
internal struct FLAC__FrameHeader
{
internal int blocksize;
internal int sample_rate;
internal int channels;
internal FLAC__ChannelAssignment channel_assignment;
internal int bits_per_sample;
internal FLAC__FrameNumberType number_type;
internal ulong sample_number; // can be uint frame_number depending on number_type
internal byte crc;
};
//internal struct FLAC__Subframe
//{
// FLAC__SubframeType type;
// [FieldOffset(4)]
// FLAC__Subframe_Constant data_constant;
// [FieldOffset(4)]
// FLAC__Subframe_Fixed data_fixed;
// [FieldOffset(4)]
// FLAC__Subframe_LPC data_lpc;
// [FieldOffset(4)]
// FLAC__Subframe_Verbatim data_verbatim;
// uint wasted_bits;
//};
internal unsafe struct FLAC__Frame
{
internal FLAC__FrameHeader header;
//fixed FLAC__Subframe subframes[FLACDLL.FLAC__MAX_CHANNELS];
//FLAC__FrameFooter footer;
};
[StructLayout(LayoutKind.Explicit), Serializable]
internal struct FLAC__StreamMetadata
{
[FieldOffset(0)]
internal FLAC__MetadataType type;
[FieldOffset(4)]
internal int is_last;
[FieldOffset(8)]
internal uint length;
[FieldOffset(16)]
internal FLAC__StreamMetadata_StreamInfo stream_info;
// [FieldOffset(16)]
// internal FLAC__StreamMetadata_Padding padding;
// [FieldOffset(16)]
// internal FLAC__StreamMetadata_Application application;
// [FieldOffset(16)]
// internal FLAC__StreamMetadata_SeekTable seek_table;
// [FieldOffset(16)]
// internal FLAC__StreamMetadata_VorbisComment vorbis_comment;
// [FieldOffset(16)]
// internal FLAC__StreamMetadata_CueSheet cue_sheet;
// [FieldOffset(16)]
// internal FLAC__StreamMetadata_Picture picture;
// [FieldOffset(16)]
// internal FLAC__StreamMetadata_Unknown unknown;
};
[StructLayout(LayoutKind.Sequential), Serializable]
internal unsafe struct FLAC__StreamMetadata_StreamInfo
{
internal int min_blocksize, max_blocksize;
internal int min_framesize, max_framesize;
internal int sample_rate;
internal int channels;
internal int bits_per_sample;
internal long total_samples;
internal fixed byte md5sum[16];
};
internal enum FLAC__ChannelAssignment
{
FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT = 0,
FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE = 1,
FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE = 2,
FLAC__CHANNEL_ASSIGNMENT_MID_SIDE = 3
};
internal enum FLAC__FrameNumberType
{
FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER,
FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER
};
internal enum FLAC__StreamDecoderInitStatus
{
FLAC__STREAM_DECODER_INIT_STATUS_OK = 0,
FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER,
FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS,
FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR,
FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE,
FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED
};
internal enum FLAC__StreamDecoderWriteStatus
{
FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE,
FLAC__STREAM_DECODER_WRITE_STATUS_ABORT
};
internal enum FLAC__StreamDecoderReadStatus
{
FLAC__STREAM_DECODER_READ_STATUS_CONTINUE,
FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM,
FLAC__STREAM_DECODER_READ_STATUS_ABORT
};
internal enum FLAC__StreamDecoderSeekStatus
{
FLAC__STREAM_DECODER_SEEK_STATUS_OK,
FLAC__STREAM_DECODER_SEEK_STATUS_ERROR,
FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED
};
internal enum FLAC__StreamDecoderTellStatus
{
FLAC__STREAM_DECODER_TELL_STATUS_OK,
FLAC__STREAM_DECODER_TELL_STATUS_ERROR,
FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED
};
internal enum FLAC__StreamDecoderLengthStatus
{
FLAC__STREAM_DECODER_LENGTH_STATUS_OK,
FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR,
FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED
};
internal enum FLAC__StreamDecoderErrorStatus
{
FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC,
FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER,
FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH,
FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM
};
internal enum FLAC__StreamDecoderState
{
FLAC__STREAM_DECODER_SEARCH_FOR_METADATA = 0,
FLAC__STREAM_DECODER_READ_METADATA,
FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC,
FLAC__STREAM_DECODER_READ_FRAME,
FLAC__STREAM_DECODER_END_OF_STREAM,
FLAC__STREAM_DECODER_OGG_ERROR,
FLAC__STREAM_DECODER_SEEK_ERROR,
FLAC__STREAM_DECODER_ABORTED,
FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR,
FLAC__STREAM_DECODER_UNINITIALIZED
};
internal enum FLAC__StreamEncoderState : int
{
FLAC__STREAM_ENCODER_OK = 0,
FLAC__STREAM_ENCODER_UNINITIALIZED,
FLAC__STREAM_ENCODER_OGG_ERROR,
FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR,
FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA,
FLAC__STREAM_ENCODER_CLIENT_ERROR,
FLAC__STREAM_ENCODER_IO_ERROR,
FLAC__STREAM_ENCODER_FRAMING_ERROR,
FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR
};
internal enum FLAC__StreamEncoderInitStatus
{
FLAC__STREAM_ENCODER_INIT_STATUS_OK = 0,
FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR,
FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER,
FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS,
FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS,
FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE,
FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE,
FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE,
FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER,
FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION,
FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER,
FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE,
FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA,
FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED
};
internal enum FLAC__MetadataType : int
{
FLAC__METADATA_TYPE_STREAMINFO = 0,
FLAC__METADATA_TYPE_PADDING = 1,
FLAC__METADATA_TYPE_APPLICATION = 2,
FLAC__METADATA_TYPE_SEEKTABLE = 3,
FLAC__METADATA_TYPE_VORBIS_COMMENT = 4,
FLAC__METADATA_TYPE_CUESHEET = 5,
FLAC__METADATA_TYPE_PICTURE = 6,
FLAC__METADATA_TYPE_UNDEFINED = 7,
FLAC__MAX_METADATA_TYPE = 126,
};
internal enum FLAC__StreamEncoderWriteStatus
{
FLAC__STREAM_ENCODER_WRITE_STATUS_OK = 0,
FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR
};
internal enum FLAC__StreamEncoderSeekStatus
{
FLAC__STREAM_ENCODER_SEEK_STATUS_OK,
FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR,
FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED
};
internal enum FLAC__StreamEncoderTellStatus
{
FLAC__STREAM_ENCODER_TELL_STATUS_OK,
FLAC__STREAM_ENCODER_TELL_STATUS_ERROR,
FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED
};
}