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 ) ;
 | 
						|
 |