157 lines
4.5 KiB
Factor
157 lines
4.5 KiB
Factor
! Copyright (C) 2007 Adam Wendt.
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
!
|
|
USING: alien alien.c-types alien.syntax combinators kernel math system ;
|
|
IN: mad
|
|
|
|
<< "mad" {
|
|
{ [ macosx? ] [ "libmad.0.dylib" ] }
|
|
{ [ unix? ] [ "libmad.so" ] }
|
|
{ [ windows? ] [ "mad.dll" ] }
|
|
} cond "cdecl" add-library >>
|
|
|
|
LIBRARY: mad
|
|
|
|
TYPEDEF: int mad_fixed_t
|
|
TYPEDEF: int mad_fixed64hi_t
|
|
TYPEDEF: uint mad_fixed64lo_t
|
|
|
|
TYPEDEF: int mad_flow
|
|
TYPEDEF: int mad_decoder_mode
|
|
TYPEDEF: int mad_error
|
|
TYPEDEF: int mad_layer
|
|
TYPEDEF: int mad_mode
|
|
TYPEDEF: int mad_emphasis
|
|
|
|
C-STRUCT: mad_timer_t
|
|
{ "long" "seconds" }
|
|
{ "ulong" "fraction" }
|
|
;
|
|
|
|
C-STRUCT: mad_bitptr
|
|
{ "uchar*" "byte" }
|
|
{ "short" "cache" }
|
|
{ "short" "left" }
|
|
;
|
|
|
|
C-STRUCT: mad_stream
|
|
{ "uchar*" "buffer" }
|
|
{ "uchar*" "buffend" }
|
|
{ "long" "skiplen" }
|
|
{ "int" "sync" }
|
|
{ "ulong" "freerate" }
|
|
{ "uchar*" "this_frame" }
|
|
{ "uchar*" "next_frame" }
|
|
{ "mad_bitptr" "ptr" }
|
|
{ "mad_bitptr" "anc_ptr" }
|
|
{ "uchar*" "main_data" }
|
|
{ "int" "md_len" }
|
|
{ "int" "options" }
|
|
{ "mad_error" "error" }
|
|
;
|
|
|
|
C-STRUCT: struct_async
|
|
{ "long" "pid" }
|
|
{ "int" "in" }
|
|
{ "int" "out" }
|
|
;
|
|
|
|
C-STRUCT: mad_header
|
|
{ "mad_layer" "layer" }
|
|
{ "mad_mode" "mode" }
|
|
{ "int" "mode_extension" }
|
|
{ "mad_emphasis" "emphasis" }
|
|
{ "ulong" "bitrate" }
|
|
{ "uint" "samplerate" }
|
|
{ "ushort" "crc_check" }
|
|
{ "ushort" "crc_target" }
|
|
{ "int" "flags" }
|
|
{ "int" "private_bits" }
|
|
{ "mad_timer_t" "duration" }
|
|
;
|
|
|
|
C-STRUCT: mad_frame
|
|
{ "mad_header" "header" }
|
|
{ "int" "options" }
|
|
{ { "mad_fixed_t" 2304 } "sbsample" }
|
|
{ "mad_fixed_t*" "overlap" }
|
|
;
|
|
|
|
C-STRUCT: mad_pcm
|
|
{ "uint" "samplerate" }
|
|
{ "ushort" "channels" }
|
|
{ "ushort" "length" }
|
|
{ { "mad_fixed_t" 2304 } "samples" }
|
|
;
|
|
|
|
: mad_pcm-sample-left ( pcm int -- sample )
|
|
swap mad_pcm-samples int-nth ;
|
|
: mad_pcm-sample-right ( pcm int -- sample )
|
|
1152 + swap mad_pcm-samples int-nth ;
|
|
|
|
C-STRUCT: mad_synth
|
|
{ { "mad_fixed_t" 1024 } "filter" }
|
|
{ "uint" "phase" }
|
|
{ "mad_pcm" "pcm" }
|
|
;
|
|
|
|
C-STRUCT: struct_sync
|
|
{ "mad_stream" "stream" }
|
|
{ "mad_frame" "frame" }
|
|
{ "mad_synth" "synth" }
|
|
;
|
|
|
|
C-STRUCT: mad_decoder
|
|
{ "mad_decoder_mode" "mode" }
|
|
{ "int" "options" }
|
|
{ "struct_async" "async" }
|
|
{ "struct_sync*" "sync" }
|
|
{ "void*" "cb_data" }
|
|
{ "void*" "input_func" }
|
|
{ "void*" "header_func" }
|
|
{ "void*" "filter_func" }
|
|
{ "void*" "output_func" }
|
|
{ "void*" "error_func" }
|
|
{ "void*" "message_func" }
|
|
;
|
|
|
|
: MAD_F_FRACBITS ( -- number ) 28 ; inline
|
|
: MAD_F_ONE HEX: 10000000 ;
|
|
|
|
: MAD_DECODER_MODE_SYNC ( -- number ) HEX: 0 ; inline
|
|
: MAD_DECODER_MODE_ASYNC ( -- number ) HEX: 1 ; inline
|
|
|
|
: MAD_FLOW_CONTINUE ( -- number ) HEX: 0 ; inline
|
|
: MAD_FLOW_STOP ( -- number ) HEX: 10 ; inline
|
|
: MAD_FLOW_BREAK ( -- number ) HEX: 11 ; inline
|
|
: MAD_FLOW_IGNORE ( -- number ) HEX: 20 ; inline
|
|
|
|
: MAD_ERROR_NONE ( -- number ) HEX: 0 ; inline
|
|
: MAD_ERROR_BUFLEN ( -- number ) HEX: 1 ; inline
|
|
: MAD_ERROR_BUFPTR ( -- number ) HEX: 2 ; inline
|
|
: MAD_ERROR_NOMEM ( -- number ) HEX: 31 ; inline
|
|
: MAD_ERROR_LOSTSYNC ( -- number ) HEX: 101 ; inline
|
|
: MAD_ERROR_BADLAYER ( -- number ) HEX: 102 ; inline
|
|
: MAD_ERROR_BADBITRATE ( -- number ) HEX: 103 ; inline
|
|
: MAD_ERROR_BADSAMPLERATE ( -- number ) HEX: 104 ; inline
|
|
: MAD_ERROR_BADEMPHASIS ( -- number ) HEX: 105 ; inline
|
|
: MAD_ERROR_BADCRC ( -- number ) HEX: 201 ; inline
|
|
: MAD_ERROR_BADBITALLOC ( -- number ) HEX: 211 ; inline
|
|
: MAD_ERROR_BADSCALEFACTOR ( -- number ) HEX: 221 ; inline
|
|
: MAD_ERROR_BADMODE ( -- number ) HEX: 222 ; inline
|
|
: MAD_ERROR_BADFRAMELEN ( -- number ) HEX: 231 ; inline
|
|
: MAD_ERROR_BADBIGVALUES ( -- number ) HEX: 232 ; inline
|
|
: MAD_ERROR_BADBLOCKTYPE ( -- number ) HEX: 233 ; inline
|
|
: MAD_ERROR_BADSCFSI ( -- number ) HEX: 234 ; inline
|
|
: MAD_ERROR_BADDATAPTR ( -- number ) HEX: 235 ; inline
|
|
: MAD_ERROR_BADPART3LEN ( -- number ) HEX: 236 ; inline
|
|
: MAD_ERROR_BADHUFFTABLE ( -- number ) HEX: 237 ; inline
|
|
: MAD_ERROR_BADHUFFDATA ( -- number ) HEX: 238 ; inline
|
|
: MAD_ERROR_BADSTEREO ( -- number ) HEX: 239 ; inline
|
|
|
|
|
|
FUNCTION: void mad_decoder_init ( mad_decoder* decoder, void* data, void* input_func, void* header_func, void* filter_func, void* output_func, void* error_func, void* message_func ) ;
|
|
FUNCTION: int mad_decoder_run ( mad_decoder* decoder, mad_decoder_mode mode ) ;
|
|
FUNCTION: void mad_stream_buffer ( mad_stream* stream, uchar* start, ulong length ) ;
|
|
|