add audio to proxy, and minor bug fixes
[goodguy/history.git] / cinelerra-5.1 / libzmpeg3 / audio / pcm.C
1 #include "../libzmpeg3.h"
2
3 int pcm_check(uint8_t *header)
4 {
5   if( header[0] == ((zmpeg3_t::PCM_START_CODE >> 24) & 0xff) &&
6       header[1] == ((zmpeg3_t::PCM_START_CODE >> 16) & 0xff) &&
7       header[2] == ((zmpeg3_t::PCM_START_CODE >>  8) & 0xff) &&
8       header[3] == ((zmpeg3_t::PCM_START_CODE >>  0) & 0xff) )
9     return 0;
10   return 1;
11 }
12
13 int zaudio_decoder_pcm_t::
14 pcm_header(uint8_t *data)
15 {
16   if( pcm_check(data) ) return 0;
17
18 /* Custom header generated by the demuxer */
19   samplerate = *(int32_t*)(data + 4);
20   bits = *(int32_t*)(data + 8);
21   channels = *(int32_t*)(data + 12);
22   framesize = *(int32_t*)(data + 16);
23
24   return framesize;
25 }
26
27 int zaudio_decoder_pcm_t::
28 do_pcm(uint8_t *zframe, int zframe_size, float **zoutput, int render)
29 {
30   int i, j;
31   int bytes_per_sample = bits / 8 * channels;
32   int output_size =
33     (zframe_size - zaudio_t::PCM_HEADERSIZE) / bytes_per_sample;
34 //zmsgs("2 %d\n", zframe_size);
35
36   if( render ) {
37     for( i=0; i < channels; ++i ) {
38 //zmsg("3\n");
39       float *output_channel = zoutput[i];
40 //zmsg("4\n");
41       switch( bits ) {
42       case 16:
43 //zmsg("5\n");
44         uint8_t *input =
45           zframe + zaudio_t::PCM_HEADERSIZE + bits / 8 * i;
46 //zmsg("6\n");
47         for( j=0; j < output_size; ++j ) {
48           int16_t sample = ((int16_t)(input[0])) << 8;
49           sample |= input[1];
50           *output_channel = (float)sample / 32767.0;
51           input += bytes_per_sample;
52           ++output_channel;
53         }
54         break;
55 //zmsg("7\n");
56       }
57     }
58   }
59
60 //zmsgs("2 %02x%02x%02x%02x\n", 
61 //  *(uint8_t*)(zframe+zaudio_t::PCM_HEADERSIZE + 0),
62 //  *(uint8_t*)(zframe+zaudio_t::PCM_HEADERSIZE + 1),
63 //  *(uint8_t*)(zframe+zaudio_t::PCM_HEADERSIZE + 2),
64 //  *(uint8_t*)(zframe+zaudio_t::PCM_HEADERSIZE + 3));
65   return output_size;
66 }
67