X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswfsound.c;h=fe3461d35881cf229c3097f3e1d6d8646f9ec5a3;hb=a970a6438fa892d043faac61ea6e27c8c88f79fa;hp=580492198848ab6ced6e57f9c6dead3e56c2ad56;hpb=77ab335e65b6db24e98fa1139f307fa8afe12efb;p=swftools.git diff --git a/lib/modules/swfsound.c b/lib/modules/swfsound.c index 5804921..fe3461d 100644 --- a/lib/modules/swfsound.c +++ b/lib/modules/swfsound.c @@ -11,52 +11,233 @@ */ +#ifndef RFXSWF_DISABLESOUND + #include "../rfxswf.h" +#ifdef BLADEENC +fjokjklj +CodecInitOut * init = 0; 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 = 0; // 0 = 8 bit, 1 = 16 bit - U8 playbacktype = 1; // 0 = mono, 1 = stereo - U8 compression = 2; // 0 = raw, 1 = ADPCM, 2 = mp3 + 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 = 3; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz - U8 size = 0; // 0 = 8 bit, 1 = 16 bit - U8 type = 1; // 0 = mono, 1 = stereo + U8 size = 1; // 0 = 8 bit, 1 = 16 bit + U8 type = 0; // 0 = mono, 1 = stereo + + CodecInitIn params; + memset(¶ms, 0, sizeof(params)); + params.frequency = 44100; //48000, 44100 or 32000 + params.mode = 3; //0 = Stereo, 2 = Dual Channel, 3 = Mono + params.emphasis = 0; //0 = None, 1 = 50/15 microsec, 3 = CCITT J.17 + params.bitrate = 128; //default is 128 (64 for mono) + init = codecInit(¶ms); swf_SetU8(tag,(playbackrate<<2)|(playbacksize<<1)|playbacktype); swf_SetU8(tag,(compression<<4)|(rate<<2)|(size<<1)|type); swf_SetU16(tag,avgnumsamples); + + printf("numSamples:%d\n",init->nSamples); + printf("bufferSize:%d\n",init->bufferSize); } -void swf_SetSoundStreamBlock(TAG*tag, U16*samples, int numsamples) +void swf_SetSoundStreamBlock(TAG*tag, S16*samples, int numsamples, char first) { - CodecInitOut * init; - CodecInitIn params; char*buf; int len = 0; + buf = malloc(init->bufferSize); if(!buf) return; + + len = codecEncodeChunk (numsamples, samples, buf); + len += codecFlush (&buf[len]); + len += codecExit (&buf[len]); - memset(¶ms, 0, sizeof(params)); - params.frequency = 44100; //48000, 44100 or 32000 - params.mode = 0; //0 = Stereo, 2 = Dual Channel, 3 = Mono - params.emphasis = 0; //0 = None, 1 = 50/15 microsec, 3 = CCITT J.17 - params.bitrate = 128; //default is 128 (64 for mono) + if(first) { + swf_SetU16(tag, numsamples); // number of samples + swf_SetU16(tag, 0); // seek + } + swf_SetBlock(tag, buf, len); + free(buf); +} +#endif - init = codecInit(¶ms); - printf("nSamples:%d\n", init->nSamples); - printf("bufferSize:%d\n", init->bufferSize); + +#ifdef LAME + +#include "../lame/lame.h" - buf = malloc(init->bufferSize); +static lame_global_flags*lame_flags; + +static void initlame(unsigned char*buf, int bufsize) +{ + lame_flags = lame_init(); + + lame_set_in_samplerate(lame_flags, 44100); + lame_set_num_channels(lame_flags, 1); + lame_set_scale(lame_flags, 0); + + // MPEG1 32, 44.1, 48khz + // MPEG2 16, 22.05, 24 + // MPEG2.5 8, 11.025, 12 + // (not used by decoding routines) + lame_set_out_samplerate(lame_flags, 11025); + + lame_set_quality(lame_flags, 0); + lame_set_mode(lame_flags, MONO/*3*/); + //lame_set_compression_ratio(lame_flags, 11.025); + lame_set_bWriteVbrTag(lame_flags, 0); + + lame_init_params(lame_flags); + lame_init_bitstream(lame_flags); + + /* The first two flush calls to lame always fail, for + some reason. Do them here where they cause no damage. */ + lame_encode_flush_nogap(lame_flags, buf, bufsize); + //printf("init:flush_nogap():%d\n", len); + 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 - len = codecEncodeChunk(numsamples, samples, buf); - len += codecFlush (&buf[len]); - len += codecExit(&buf[len]); + 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; + int oldlen=0,len = 0; + int bufsize = 16384; + int numsamples = 1152*2; + + buf = malloc(bufsize); + if(!buf) + return; - swf_SetU16(tag, numsamples); // number of samples - swf_SetU16(tag, 0); // seek + if(first) { + int fs = lame_get_framesize(lame_flags); + //printf("framesize:%d\n", fs); + swf_SetU16(tag, fs); // samples per mp3 frame + swf_SetU16(tag, 0); // seek + } + + len += lame_encode_buffer(lame_flags, samples, samples, numsamples, &buf[len], bufsize-len); + //printf("block: %d (+%d)\n", len, len-oldlen); + oldlen = len; + + len += lame_encode_flush_nogap(lame_flags, &buf[len], bufsize-len); + //printf("flush: %d (+%d)\n", len, len-oldlen); + oldlen = len; + swf_SetBlock(tag, buf, len); + + /* len += lame_encode_flush(lame_flags, &buf[len], bufsize-len); + printf("flush! %d (+%d)\n", len, len-oldlen);*/ + + free(buf); +} + +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