From a970a6438fa892d043faac61ea6e27c8c88f79fa Mon Sep 17 00:00:00 2001 From: kramm Date: Sat, 4 Jan 2003 13:43:05 +0000 Subject: [PATCH] implemented definesound/startsound. --- lib/modules/swfsound.c | 124 +++++++++++++++++++++++++++++++++++++++--------- lib/rfxswf.h | 23 ++++++++- 2 files changed, 122 insertions(+), 25 deletions(-) diff --git a/lib/modules/swfsound.c b/lib/modules/swfsound.c index ac90930..fe3461d 100644 --- a/lib/modules/swfsound.c +++ b/lib/modules/swfsound.c @@ -23,7 +23,7 @@ void swf_SetSoundStreamHead(TAG*tag, U16 avgnumsamples) U8 playbackrate = 3; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz U8 playbacksize = 1; // 0 = 8 bit, 1 = 16 bit U8 playbacktype = 0; // 0 = mono, 1 = stereo - U8 compression = 2; // 0 = raw, 1 = ADPCM, 2 = mp3 + U8 compression = 2; // 0 = raw, 1 = ADPCM, 2 = mp3, 3 = raw le, 6 = nellymoser U8 rate = 3; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz U8 size = 1; // 0 = 8 bit, 1 = 16 bit U8 type = 0; // 0 = mono, 1 = stereo @@ -73,23 +73,8 @@ void swf_SetSoundStreamBlock(TAG*tag, S16*samples, int numsamples, char first) static lame_global_flags*lame_flags; -void swf_SetSoundStreamHead(TAG*tag, int avgnumsamples) +static void initlame(unsigned char*buf, int bufsize) { - unsigned char buf[4096]; - int bufsize = 1152*2; - int len; - short int samples[1152*2]; - - U8 playbackrate = 1; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz - U8 playbacksize = 1; // 0 = 8 bit, 1 = 16 bit - U8 playbacktype = 0; // 0 = mono, 1 = stereo - U8 compression = 2; // 0 = raw, 1 = ADPCM, 2 = mp3 - U8 rate = 1; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz - U8 size = 1; // 0 = 8 bit, 1 = 16 bit - U8 type = 0; // 0 = mono, 1 = stereo - - memset(samples,0,sizeof(samples)); - lame_flags = lame_init(); lame_set_in_samplerate(lame_flags, 44100); @@ -110,18 +95,38 @@ void swf_SetSoundStreamHead(TAG*tag, int avgnumsamples) lame_init_params(lame_flags); lame_init_bitstream(lame_flags); - swf_SetU8(tag,(playbackrate<<2)|(playbacksize<<1)|playbacktype); - swf_SetU8(tag,(compression<<4)|(rate<<2)|(size<<1)|type); - swf_SetU16(tag,avgnumsamples); - /* The first two flush calls to lame always fail, for some reason. Do them here where they cause no damage. */ - len = lame_encode_flush_nogap(lame_flags, buf, bufsize); + lame_encode_flush_nogap(lame_flags, buf, bufsize); //printf("init:flush_nogap():%d\n", len); - len = lame_encode_flush(lame_flags, buf, bufsize); + lame_encode_flush(lame_flags, buf, bufsize); //printf("init:flush():%d\n", len); } +void swf_SetSoundStreamHead(TAG*tag, int avgnumsamples) +{ + unsigned char buf[4096]; + int bufsize = 1152*2; + int len; + short int samples[1152*2]; + + U8 playbackrate = 1; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz + U8 playbacksize = 1; // 0 = 8 bit, 1 = 16 bit + U8 playbacktype = 0; // 0 = mono, 1 = stereo + U8 compression = 2; // 0 = raw, 1 = ADPCM, 2 = mp3, 3 = raw le, 6 = nellymoser + U8 rate = 1; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz + U8 size = 1; // 0 = 8 bit, 1 = 16 bit + U8 type = 0; // 0 = mono, 1 = stereo + + memset(samples,0,sizeof(samples)); + + initlame(buf, bufsize); + + swf_SetU8(tag,(playbackrate<<2)|(playbacksize<<1)|playbacktype); + swf_SetU8(tag,(compression<<4)|(rate<<2)|(size<<1)|type); + swf_SetU16(tag,avgnumsamples); +} + void swf_SetSoundStreamBlock(TAG*tag, S16*samples, char first) { char*buf; @@ -160,6 +165,79 @@ void swf_SetSoundStreamEnd(TAG*tag) { lame_close (lame_flags); } + +void swf_SetSoundDefine(TAG*tag, S16*samples, int num) +{ + char*buf; + int oldlen=0,len = 0; + int bufsize = 16384; + int blocksize = 1152*2; + int t; + int blocks; + + U8 compression = 2; // 0 = raw, 1 = ADPCM, 2 = mp3, 3 = raw le, 6 = nellymoser + U8 rate = 1; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz + U8 size = 1; // 0 = 8 bit, 1 = 16 bit + U8 type = 0; // 0 = mono, 1 = stereo + + blocks = num / (blocksize); + + swf_SetU8(tag,(compression<<4)|(rate<<2)|(size<<1)|type); + swf_SetU32(tag,blocks*blocksize); + + buf = malloc(bufsize); + if(!buf) + return; + + initlame(buf, bufsize); + + swf_SetU16(tag, 0); //delayseek + for(t=0;tstop?SOUNDINFO_STOP:0) + |(info->multiple?SOUNDINFO_NOMULTIPLE:0) + |(info->envelopes?SOUNDINFO_HASENVELOPE:0) + |(info->loops?SOUNDINFO_HASLOOPS:0) + |(info->outpoint?SOUNDINFO_HASOUTPOINT:0) + |(info->inpoint?SOUNDINFO_HASINPOINT:0); + swf_SetU8(tag, flags); + if(flags&SOUNDINFO_HASINPOINT) + swf_SetU32(tag, info->inpoint); + if(flags&SOUNDINFO_HASOUTPOINT) + swf_SetU32(tag, info->outpoint); + if(flags&SOUNDINFO_HASLOOPS) + swf_SetU16(tag, info->loops); + if(flags&SOUNDINFO_HASENVELOPE) { + int t; + swf_SetU8(tag, info->envelopes); + for(t=0;tenvelopes;t++) { + swf_SetU32(tag, info->pos[t]); + swf_SetU16(tag, info->left[t]); + swf_SetU16(tag, info->right[t]); + } + } +} + #endif #endif // RFXSWF_DISABLESOUND diff --git a/lib/rfxswf.h b/lib/rfxswf.h index 4a567dc..db66176 100644 --- a/lib/rfxswf.h +++ b/lib/rfxswf.h @@ -126,6 +126,22 @@ typedef struct _TAG // NEVER access a Tag-Struct directly ! } TAG, * LPTAG; +typedef struct _SOUNDINFO +{ + U8 stop; + U8 multiple; //continue playing if already started + + U32 inpoint; + U32 outpoint; + + U16 loops; + U8 envelopes; + + //envelope: + U32* pos; + U32* left; + U32* right; +} SOUNDINFO; typedef struct _SWF { U8 fileVersion; @@ -616,8 +632,11 @@ int swf_SetLosslessBitsGrayscale(TAG * t,U16 width,U16 height,U8 * bitmap); // swfsound.c void swf_SetSoundStreamHead(TAG*tag, int avgnumsamples); -/* expects 2304 samples */ -void swf_SetSoundStreamBlock(TAG*tag, S16*samples, char first); +void swf_SetSoundStreamBlock(TAG*tag, S16*samples, char first); /* expects 2304 samples */ + +void swf_SetSoundDefine(TAG*tag, S16*samples, int num); + +void swf_SetSoundInfo(TAG*tag, SOUNDINFO*info); #endif // RFXSWF_DISABLESOUND -- 1.7.10.4