HSTREAM BASSDEF(BASS_StreamCreate)(DWORD freq, DWORD chans, DWORD flags, void *proc, DWORD user); #### typedef DWORD (CALLBACK STREAMPROC)(HSTREAM handle, void *buffer, DWORD length, DWORD user); #### DWORD CALLBACK stream(HSTREAM handle, char *buffer, int length, DWORD user) { int c; // check how much recorded data is buffered c=BASS_ChannelGetData(rchan,0,BASS_DATA_AVAILABLE); c-=length; if (c>2*chunk+1764) { // buffer has gotten pretty large so remove some c-=chunk; // leave a single 'chunk' BASS_ChannelGetData(rchan,0,c); // remove it } // fetch recorded data into stream c=BASS_ChannelGetData(rchan,buffer,length); if (c## #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" #include #include "callback.c" #include "const-c.inc" MODULE = Audio::BASSXS PACKAGE = Audio::BASSXS INCLUDE: const-xs.inc PROTOTYPES: DISABLE HSTREAM BASS_StreamCreate(freq, chans, flags, proc, user) DWORD freq DWORD chans DWORD flags SV * proc DWORD user CODE: if (streamproccallback == (SV*)NULL) /* First time, so create a new SV */ streamproccallback = newSVsv(proc) ; else /* Been here before, so overwrite */ SvSetSV(streamproccallback, proc) ; RETVAL = BASS_StreamCreate(freq,chans,flags,(STREAMPROC*)MyStreamProc, user); OUTPUT: RETVAL #### static SV * streamproccallback = (SV*)NULL; DWORD CALLBACK MyStreamProc(handle,buffer,length,user) HSTREAM handle; char *buffer; int length; DWORD user; { if (streamproccallback == (SV*)NULL) return 0; dSP ; int ret; SV * shandle; SV * sbuffer; SV * slength; SV * suser; ENTER; SAVETMPS; shandle = sv_2mortal(newSViv(handle)); sbuffer = sv_2mortal(newSVpv(buffer,length)); slength = sv_2mortal(newSViv(length)); suser = sv_2mortal(newSViv(user)); PUSHMARK(SP); XPUSHs(shandle); XPUSHs(sbuffer); XPUSHs(slength); XPUSHs(suser); PUTBACK; ret = call_sv(streamproccallback, G_SCALAR); buffer = SvPV(sbuffer,length); FREETMPS; LEAVE; return ret; } #### #!/usr/bin/perl use strict; use warnings; use Audio::BASSXS; our $audio = 'test.mp3'; open(FH, "<", $audio) || die "Can't open $audio: $!"; binmode(FH); sub testsub { # We get 4 parameters in the @_: # ($handle,$buffer,$length,$user) = @_; my $read = sysread(FH, $_[1], $_[2]); unless ($read) { $read = $read|BASS_STREAMPROC_END; } warn "$read\n"; return $read; } BASS_Init(1,44100,0,0,0); my $stream = BASS_StreamCreate(44100,2,0,\&testsub, 0); warn BASS_ErrorString(BASS_ErrorGetCode) unless $stream; BASS_StreamPlay($stream,0,BASS_SAMPLE_LOOP); sleep(10); close(FH);