X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=src%2Fwav2swf.c;h=89add267044b0325643b9e8bd3152b4553d19a01;hp=45ef407bd0f6dba44161d1f7feaca02f55760155;hb=a5f50be98c64a4f4cd25758a43386528a6998aad;hpb=9e4852618a107375483987d95090121737e677af diff --git a/src/wav2swf.c b/src/wav2swf.c index 45ef407..89add26 100644 --- a/src/wav2swf.c +++ b/src/wav2swf.c @@ -1,5 +1,5 @@ -/* swfextract.c - Allows to extract parts of the swf into a new file. +/* wav2swf.c + Converts WAV/WAVE files to SWF. Part of the swftools package. @@ -18,6 +18,8 @@ char * filename = 0; char * outputname = "output.swf"; int verbose = 2; +#define DEFINESOUND_MP3 1 //define sound uses mp3?- undefine for raw sound. + struct options_t options[] = { {"o","output"}, @@ -25,6 +27,9 @@ struct options_t options[] = {"d","definesound"}, {"l","loop"}, {"r","framerate"}, + {"s","samplerate"}, + {"b","bitrate"}, + {"C","cgi"}, {"V","version"}, {0,0} }; @@ -32,6 +37,12 @@ struct options_t options[] = static int loop = 0; static int definesound = 0; static int framerate = 0; +static int samplerate = 11025; +static int bitrate = 32; +static int do_cgi = 0; + +static int mp3_bitrates[] = +{ 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0}; int args_callback_option(char*name,char*val) { @@ -49,18 +60,64 @@ int args_callback_option(char*name,char*val) } else if(!strcmp(name, "l")) { loop = atoi(val); + definesound = 1; return 1; } else if(!strcmp(name, "v")) { verbose ++; return 0; } + else if(!strcmp(name, "C")) { + do_cgi = 1; + return 0; + } else if(!strcmp(name, "r")) { float f; sscanf(val, "%f", &f); framerate = f*256; return 1; } + else if(!strcmp(name, "s")) { + samplerate = atoi(val); + if(samplerate > 5000 && samplerate < 6000) + samplerate = 5512; + else if(samplerate > 11000 && samplerate < 12000) + samplerate = 11025; + else if(samplerate > 22000 && samplerate < 23000) + samplerate = 22050; + else if(samplerate > 44000 && samplerate < 45000) + samplerate = 44100; + else { + fprintf(stderr, "Invalid samplerate: %d\n", samplerate); + fprintf(stderr, "Allowed values: 11025, 22050\n", samplerate); + exit(1); + } + return 1; + } + else if(!strcmp(name, "b")) { + int t; + int b = atoi(val); + if(b<=0) { + fprintf(stderr, "Not a valid bitrate: %s\n", val); + exit(1); + } + if(b>160) { + fprintf(stderr, "Bitrate must be <144. (%s)\n", val); + exit(1); + } + for(t=0;mp3_bitrates[t];t++) { + if(b== mp3_bitrates[t]) { + bitrate = b; + return 1; + } + } + fprintf(stderr, "Invalid bitrate. Allowed bitrates are:\n"); + for(t=0;mp3_bitrates[t];t++) { + printf("%d ", mp3_bitrates[t]); + } + printf("\n"); + exit(1); + } else { printf("Unknown option: -%s\n", name); exit(1); @@ -75,10 +132,13 @@ void args_callback_usage(char*name) { printf("Usage: %s [-o filename] file.wav\n", name); printf("\t-v , --verbose\t\t\t Be more verbose\n"); - printf("\t-d , --definesound\t\t\t Generate a DefineSound tag instead of streaming sound\n"); + printf("\t-d , --definesound\t\t Generate a DefineSound tag instead of streaming sound\n"); printf("\t-l , --loop n\t\t\t Loop sound n times (implies -d)\n"); - printf("\t-r , --framerate fps\t\t\t Set framerate to fps frames per seond\n"); + printf("\t-r , --framerate fps\t\t Set framerate to fps frames per second\n"); + printf("\t-s , --samplerate sps\t\t Set samplerate to sps frames per second (default: 11025)\n"); + printf("\t-b , --bitrate bps\t\t Set mp3 bitrate (default: 32)\n"); printf("\t-o , --output filename\t\t set output filename (default: output.swf)\n"); + printf("\t-C , --cgi\t\t\t For use as CGI- prepend http header, write to stdout\n"); printf("\t-V , --version\t\t\t Print program version and exit\n"); } int args_callback_command(char*name,char*val) @@ -91,6 +151,10 @@ int args_callback_command(char*name,char*val) return 0; } +extern int swf_mp3_bitrate; +extern int swf_mp3_out_samplerate; +extern int swf_mp3_in_samplerate; + int main (int argc,char ** argv) { SWF swf; @@ -106,32 +170,38 @@ int main (int argc,char ** argv) int blocksize; float blockspersecond; float framespersecond; + float samplesperframe; float framesperblock; - float framepos = 0; + float samplesperblock; U16* samples; int numsamples; processargs(argc, argv); - if(!definesound && framerate) { - printf("Warning! The -r option is experimental and won't work without -d\n"); - } + blocksize = 576; + blockspersecond = (float)samplerate/blocksize; - blocksize = 1152; - blockspersecond = 11025.0/blocksize; framespersecond = blockspersecond; if(framerate) framespersecond = framerate/256.0; - framesperblock = framespersecond/blockspersecond; + framesperblock = framespersecond / blockspersecond; + samplesperframe = (blocksize * blockspersecond) / framespersecond; + samplesperblock = samplesperframe * framesperblock; + initLog(0,-1,0,0,-1,verbose); + if(!filename) { + msg(" You must supply a filename"); + exit(1); + } + if(!readWAV(filename, &wav)) { - logf(" Error reading %s", filename); + msg(" Error reading %s", filename); exit(1); } - convertWAV2mono(&wav,&wav2, 44100); + convertWAV2mono(&wav,&wav2, samplerate); //printWAVInfo(&wav); //printWAVInfo(&wav2); samples = (U16*)wav2.data; @@ -151,34 +221,65 @@ int main (int argc,char ** argv) rgb.g = 0xff; rgb.b = 0xff; swf_SetRGB(tag,&rgb); + + swf_mp3_bitrate = bitrate; + swf_mp3_out_samplerate = samplerate; + swf_mp3_in_samplerate = samplerate; if(!definesound) { + int oldframepos=-1, newframepos=0; + float framesamplepos = 0; + float framepos = 0; + float samplepos = 0; + ActionTAG* a = 0; + U16 v1=0,v2=0; tag = swf_InsertTag(tag, ST_SOUNDSTREAMHEAD); - swf_SetSoundStreamHead(tag, blocksize); - - logf(" %d blocks", numsamples/(blocksize*2)); - for(t=0;t %d blocks", numsamples/blocksize); + for(t=0;t Writing block %d", t); - block1 = &samples[t*2*blocksize]; - swf_SetSoundStreamBlock(tag, block1, 1); + int seek = blocksize - ((int)samplepos - (int)framesamplepos); - oldframe = (int)framepos; + if(newframepos!=oldframepos) { + tag = swf_InsertTag(tag, ST_SOUNDSTREAMBLOCK); + msg(" Starting block %d %d+%d", t, (int)samplepos, (int)blocksize); + block1 = &samples[t*blocksize]; + swf_SetSoundStreamBlock(tag, block1, seek, 1); + v1 = v2 = GET16(tag->data); + } else { + msg(" Adding data...", t); + block1 = &samples[t*blocksize]; + swf_SetSoundStreamBlock(tag, block1, seek, 0); + v1+=v2; + PUT16(tag->data, v1); + } + samplepos += blocksize; + + oldframepos = (int)framepos; framepos += framesperblock; - newframe = (int)framepos; - for(s=oldframe;s 11025 + swf_SetBlock(tag, wav2.data, numsamples*2); +#endif + + tag = swf_InsertTag(tag, ST_STARTSOUND); swf_SetU16(tag, 24); //id memset(&info, 0, sizeof(info)); @@ -188,9 +289,13 @@ int main (int argc,char ** argv) tag = swf_InsertTag(tag, ST_END); } - f = open(outputname,O_WRONLY|O_CREAT|O_TRUNC, 0644); - if FAILED(swf_WriteSWF(f,&swf)) fprintf(stderr,"WriteSWF() failed.\n"); - close(f); + if(do_cgi) { + if FAILED(swf_WriteCGI(&swf)) fprintf(stderr,"WriteCGI() failed.\n"); + } else { + f = open(outputname,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); + if FAILED(swf_WriteSWF(f,&swf)) fprintf(stderr,"WriteSWF() failed.\n"); + close(f); + } swf_FreeTags(&swf); return 0;