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