3 SWF Sound handling routines
5 Extension module for the rfxswf library.
6 Part of the swftools package.
8 Copyright (c) 2001, 2002 Matthias Kramm <kramm@quiss.org>
10 This file is distributed under the GPL, see file COPYING for details
14 #ifndef RFXSWF_DISABLESOUND
16 #include "../rfxswf.h"
20 CodecInitOut * init = 0;
21 void swf_SetSoundStreamHead(TAG*tag, U16 avgnumsamples)
23 U8 playbackrate = 3; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz
24 U8 playbacksize = 1; // 0 = 8 bit, 1 = 16 bit
25 U8 playbacktype = 0; // 0 = mono, 1 = stereo
26 U8 compression = 2; // 0 = raw, 1 = ADPCM, 2 = mp3
27 U8 rate = 3; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz
28 U8 size = 1; // 0 = 8 bit, 1 = 16 bit
29 U8 type = 0; // 0 = mono, 1 = stereo
32 memset(¶ms, 0, sizeof(params));
33 params.frequency = 44100; //48000, 44100 or 32000
34 params.mode = 3; //0 = Stereo, 2 = Dual Channel, 3 = Mono
35 params.emphasis = 0; //0 = None, 1 = 50/15 microsec, 3 = CCITT J.17
36 params.bitrate = 128; //default is 128 (64 for mono)
37 init = codecInit(¶ms);
39 swf_SetU8(tag,(playbackrate<<2)|(playbacksize<<1)|playbacktype);
40 swf_SetU8(tag,(compression<<4)|(rate<<2)|(size<<1)|type);
41 swf_SetU16(tag,avgnumsamples);
43 printf("numSamples:%d\n",init->nSamples);
44 printf("bufferSize:%d\n",init->bufferSize);
47 void swf_SetSoundStreamBlock(TAG*tag, S16*samples, int numsamples, char first)
52 buf = malloc(init->bufferSize);
56 len = codecEncodeChunk (numsamples, samples, buf);
57 len += codecFlush (&buf[len]);
58 len += codecExit (&buf[len]);
61 swf_SetU16(tag, numsamples); // number of samples
62 swf_SetU16(tag, 0); // seek
64 swf_SetBlock(tag, buf, len);
72 #include "../lame/lame.h"
74 static lame_global_flags*lame_flags;
76 void swf_SetSoundStreamHead(TAG*tag, int avgnumsamples)
78 unsigned char buf[4096];
81 short int samples[1152*2];
83 U8 playbackrate = 1; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz
84 U8 playbacksize = 1; // 0 = 8 bit, 1 = 16 bit
85 U8 playbacktype = 0; // 0 = mono, 1 = stereo
86 U8 compression = 2; // 0 = raw, 1 = ADPCM, 2 = mp3
87 U8 rate = 1; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz
88 U8 size = 1; // 0 = 8 bit, 1 = 16 bit
89 U8 type = 0; // 0 = mono, 1 = stereo
91 memset(samples,0,sizeof(samples));
93 lame_flags = lame_init();
95 lame_set_in_samplerate(lame_flags, 44100);
96 lame_set_num_channels(lame_flags, 1);
97 lame_set_scale(lame_flags, 0);
99 // MPEG1 32, 44.1, 48khz
100 // MPEG2 16, 22.05, 24
101 // MPEG2.5 8, 11.025, 12
102 // (not used by decoding routines)
103 lame_set_out_samplerate(lame_flags, 11025);
105 lame_set_quality(lame_flags, 0);
106 lame_set_mode(lame_flags, MONO/*3*/);
107 //lame_set_compression_ratio(lame_flags, 11.025);
108 lame_set_bWriteVbrTag(lame_flags, 0);
110 lame_init_params(lame_flags);
111 lame_init_bitstream(lame_flags);
113 swf_SetU8(tag,(playbackrate<<2)|(playbacksize<<1)|playbacktype);
114 swf_SetU8(tag,(compression<<4)|(rate<<2)|(size<<1)|type);
115 swf_SetU16(tag,avgnumsamples);
117 /* The first two flush calls to lame always fail, for
118 some reason. Do them here where they cause no damage. */
119 len = lame_encode_flush_nogap(lame_flags, buf, bufsize);
120 //printf("init:flush_nogap():%d\n", len);
121 len = lame_encode_flush(lame_flags, buf, bufsize);
122 //printf("init:flush():%d\n", len);
125 void swf_SetSoundStreamBlock(TAG*tag, S16*samples, char first)
128 int oldlen=0,len = 0;
130 int numsamples = 1152*2;
132 buf = malloc(bufsize);
137 int fs = lame_get_framesize(lame_flags);
138 //printf("framesize:%d\n", fs);
139 swf_SetU16(tag, fs); // samples per mp3 frame
140 swf_SetU16(tag, 0); // seek
143 len += lame_encode_buffer(lame_flags, samples, samples, numsamples, &buf[len], bufsize-len);
144 //printf("block: %d (+%d)\n", len, len-oldlen);
147 len += lame_encode_flush_nogap(lame_flags, &buf[len], bufsize-len);
148 //printf("flush: %d (+%d)\n", len, len-oldlen);
151 swf_SetBlock(tag, buf, len);
153 /* len += lame_encode_flush(lame_flags, &buf[len], bufsize-len);
154 printf("flush! %d (+%d)\n", len, len-oldlen);*/
159 void swf_SetSoundStreamEnd(TAG*tag)
161 lame_close (lame_flags);
165 #endif // RFXSWF_DISABLESOUND