FLAC Decoder by stream

Share your advanced PureBasic knowledge/code with the community.
User avatar
oryaaaaa
Addict
Addict
Posts: 825
Joined: Mon Jan 12, 2004 11:40 pm
Location: Okazaki, JAPAN

FLAC Decoder by stream

Post by oryaaaaa »

I used stupid way. :evil:

Code: Select all

; Author oryaaaaa.  2009/11/11
;  ----------------------------------
;/  You need flac-1.2.1-devel-win.zip
;/   flac-1.2.1-devel-win\lib\libFLAC.lib and libFLAC.dll
;/   IF you use FLAC API LIB, your software applied LGPL License
;/   But Flac.exe and others are GPL License.

Enumeration
  #FLAC__STREAM_DECODER_READ_STATUS_CONTINUE
	#FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM
  #FLAC__STREAM_DECODER_READ_STATUS_ABORT
EndEnumeration

Enumeration
  #FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE
	#FLAC__STREAM_DECODER_WRITE_STATUS_ABORT
EndEnumeration

ImportC "libFLAC.lib"
  FLAC__stream_decoder_delete( )
  FLAC__stream_decoder_finish( )
  FLAC__stream_decoder_flush( )
  FLAC__stream_decoder_get_bits_per_sample(decoder.l)
  FLAC__stream_decoder_get_blocksize(decoder.l)
  FLAC__stream_decoder_get_channel_assignment(decoder.l)
  FLAC__stream_decoder_get_channels(decoder.l)
  FLAC__stream_decoder_get_decode_position(decoder.l)
  FLAC__stream_decoder_get_md5_checking( )
  FLAC__stream_decoder_get_resolved_state_string( )
  FLAC__stream_decoder_get_sample_rate(decoder.l)
  FLAC__stream_decoder_get_state(decoder.l)
  FLAC__stream_decoder_get_total_samples(decoder.l)
  FLAC__stream_decoder_init_FILE( )
  FLAC__stream_decoder_init_ogg_FILE( )
  FLAC__stream_decoder_init_ogg_stream( )
  FLAC__stream_decoder_init_stream(decoder.l, readcallback.l, seekcallback.l, tellcallback.l, lengthcallback.l, eofcallback.l, writecallback.l, Metacallback.l, errcallback.l, *cliend_data)
  FLAC__stream_decoder_new( )
  FLAC__stream_decoder_process_single(decoder.l)
  FLAC__stream_decoder_process_until_end_of_metadata(decoder.l)
  FLAC__stream_decoder_process_until_end_of_stream(decoder.l)
  FLAC__stream_decoder_reset( )
  FLAC__stream_decoder_seek_absolute( )
  FLAC__stream_decoder_set_md5_checking( )
  FLAC__stream_decoder_set_metadata_ignore( )
  FLAC__stream_decoder_set_metadata_ignore_all( )
  FLAC__stream_decoder_set_metadata_ignore_application( )
  FLAC__stream_decoder_set_metadata_respond( )
  FLAC__stream_decoder_set_metadata_respond_all( )
  FLAC__stream_decoder_set_metadata_respond_application( )
  FLAC__stream_decoder_set_ogg_serial_number( )
  FLAC__stream_decoder_skip_single_frame( )
EndImport

;/ decode

Global File.l = ReadFile(#PB_Any, OpenFileRequester("","", "*.flac",0))
Global callFile.l = CreateFile(#PB_Any, "test.wav")
Global decoder.l = FLAC__stream_decoder_new()

ProcedureC read_callback(*decoder, *buffer, *Bytes, *cliend_data)
  Protected err.l
  err = ReadData(File, *buffer, PeekL(*Bytes)) 
  ;Debug "Read >"+Str(Loc(File))+ " Bytes "+Str(PeekL(*Bytes))+ " Error "+Str(err)
  If err=0
    ProcedureReturn #FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM
  ElseIf err=PeekL(*Bytes) 
    ProcedureReturn #FLAC__STREAM_DECODER_READ_STATUS_CONTINUE
  Else
    ProcedureReturn #FLAC__STREAM_DECODER_READ_STATUS_ABORT
  EndIf 
EndProcedure

ProcedureC write_callback(*decoder, *frame, *buffer, *cliend_data)
  Protected err.l, aa.l
  For aa=0 To FLAC__stream_decoder_get_blocksize(decoder.l)-1
    WriteWord(callFile, PeekL(PeekL(*buffer)+aa*4)) 
    WriteWord(callFile, PeekL(PeekL(*buffer+4)+aa*4)) 
  Next
  If err=0
    ProcedureReturn #FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE
  Else
    ProcedureReturn #FLAC__STREAM_DECODER_WRITE_STATUS_ABORT
  EndIf
EndProcedure

ProcedureC error_callback(*decoder, Status.l, *cliend_data)
  Debug "Error"
  Debug Status 
EndProcedure

FLAC__stream_decoder_init_stream(decoder, @read_callback(),0,0,0,0, @write_callback(),0,@error_callback(),0)
FLAC__stream_decoder_process_until_end_of_stream(decoder)

CloseFile(File)
CloseFile(callFile)
KarLKoX
Enthusiast
Enthusiast
Posts: 681
Joined: Mon Oct 06, 2003 7:13 pm
Location: France
Contact:

Re: FLAC Decoder by stream

Post by KarLKoX »

Simple and nice ! :wink:
"Qui baise trop bouffe un poil." P. Desproges

http://karlkox.blogspot.com/
Post Reply