X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=lcr.git;a=blobdiff_plain;f=tones.c;h=4a386ffc845e8d1c23530e1b338b7fe3f39320e6;hp=45c05c98ef37e425cde422c0de82d83ad136bb40;hb=701b046a45c2c79cc6d07ac3a4f84f499f7ed376;hpb=2ed0fee489c37a6e2d4473f6185ebbe3e746ac11 diff --git a/tones.c b/tones.c index 45c05c9..4a386ff 100644 --- a/tones.c +++ b/tones.c @@ -276,11 +276,17 @@ int open_tone(char *file, int *codec, signed long *length, signed long *left) /* * read from tone, check size * the len must be the number of samples, NOT for the bytes to read!! + * the data returned is law-code */ -int read_tone(int fh, void *buffer, int codec, int len, signed long size, signed long *left, int speed) +int read_tone(int fh, unsigned char *buffer, int codec, int len, signed long size, signed long *left, int speed) { int l; int offset; + signed short buffer16[len], *buf16 = buffer16; + signed short buffer32[len<<1], *buf32 = buffer32; + unsigned char buffer8[len], *buf8 = buffer8; + signed long sample; + int i = 0; //printf("left=%ld\n",*left); /* if no *left is given (law has unknown length) */ @@ -319,17 +325,25 @@ int read_tone(int fh, void *buffer, int codec, int len, signed long size, signed break; case CODEC_MONO: - l = read(fh, buffer, len<<1); /* as is */ - if (l>0) - l = l>>1; + l = read(fh, buf16, len<<1); + if (l>0) + { + l = l>>1; + while(i < l) + { + sample = *buf16++; + if (sample < -32767) + sample = -32767; + if (sample > 32767) + sample = 32767; + *buffer++ = audio_s16_to_law[sample & 0xffff]; + i++; + } + } break; case CODEC_STEREO: { - signed short buffer32[len<<1], *buf32 = buffer32; - signed short *buf16 = (signed short *)buffer; - signed long sample; - int i = 0; l = read(fh, buf32, len<<2); if (l>0) { @@ -341,7 +355,7 @@ int read_tone(int fh, void *buffer, int codec, int len, signed long size, signed sample = -32767; if (sample > 32767) sample = 32767; - *buf16++ = sample; + *buffer++ = audio_s16_to_law[sample & 0xffff]; i++; } } @@ -350,15 +364,12 @@ int read_tone(int fh, void *buffer, int codec, int len, signed long size, signed case CODEC_8BIT: { - unsigned char buffer8[len], *buf8 = buffer8; - signed short *buf16 = (signed short *)buffer; - int i = 0; l = read(fh, buf8, len); if (l>0) { while(i < l) { - *buf16++ = (((*buf8++) << 8) - 0x8000) & 0xffff; + *buffer++ = audio_s16_to_law[(((*buf8++)<<8)-0x8000) & 0xffff]; i++; } } @@ -366,8 +377,7 @@ int read_tone(int fh, void *buffer, int codec, int len, signed long size, signed break; default: - PERROR("codec %d is not specified or supported, exitting...\n", codec); - exit(-1); + FATAL("codec %d is not supported.\n", codec); } if (l>0 && left) @@ -395,12 +405,12 @@ void free_tones(void) { temp = tonesettone_temp; tonesettone_temp = tonesettone_temp->next; - free(temp); + FREE(temp, sizeof(struct tonesettone)); memuse--; } temp = toneset_temp; toneset_temp = toneset_temp->next; - free(temp); + FREE(temp, sizeof(struct toneset)); memuse--; } toneset_first = NULL; @@ -420,7 +430,7 @@ int fetch_tones(void) char filename[256], name[256]; int fh; int tone_codec; - signed long tone_size, tone_left, real_size; + signed long tone_size, tone_left; unsigned long memory = 0; int samples = 0; @@ -454,15 +464,9 @@ int fetch_tones(void) printf("PBX: Fetching tones '%s'\n", p); PDEBUG(DEBUG_PORT, "fetching tones directory '%s'\n", p); - *toneset_nextpointer = (struct toneset *)calloc(1, sizeof(struct toneset)); - if (*toneset_nextpointer == NULL) - { - PERROR("No memory for tone set: '%s'\n",p); - return(0); - } + *toneset_nextpointer = (struct toneset *)MALLOC(sizeof(struct toneset)); memuse++; memory += sizeof(struct toneset); - memset(*toneset_nextpointer, 0 , sizeof(struct toneset)); SCPY((*toneset_nextpointer)->directory, p); tonesettone_nextpointer = &(*toneset_nextpointer)->first; @@ -515,43 +519,11 @@ int fetch_tones(void) continue; } - /* real size */ - switch(tone_codec) - { - case CODEC_LAW: - real_size = tone_size; - break; - - case CODEC_MONO: - real_size = tone_size << 1; - break; - - case CODEC_STEREO: - real_size = tone_size << 1; - break; - - case CODEC_8BIT: - real_size = tone_size << 1; - break; - - default: - PERROR("codec %d is not specified or supported, exitting...\n", tone_codec); - exit(-1); - } - - /* allocate tone */ - *tonesettone_nextpointer = (struct tonesettone *)calloc(1, sizeof(struct tonesettone)+real_size); - if (*toneset_nextpointer == NULL) - { - PERROR("No memory for tone set: '%s'\n",p); - close(fh); - fduse--; - return(0); - } + /* Allocate tone */ + *tonesettone_nextpointer = (struct tonesettone *)MALLOC(sizeof(struct tonesettone)+tone_size); memuse++; //printf("tone:%s, %ld bytes\n", name, tone_size); - memset(*tonesettone_nextpointer, 0 , sizeof(struct tonesettone)+real_size); - memory += sizeof(struct tonesettone)+real_size; + memory += sizeof(struct tonesettone)+tone_size; samples ++; /* load tone */ @@ -629,7 +601,7 @@ void *open_tone_fetched(char *dir, char *file, int *codec, signed long *length, * read from fetched tone, check size * the len must be the number of samples, NOT for the bytes to read!! */ -int read_tone_fetched(void **fetched, void *buffer, int codec, int len, signed long size, signed long *left, int speed) +int read_tone_fetched(void **fetched, void *buffer, int len, signed long size, signed long *left, int speed) { int l; //printf("left=%ld\n",*left); @@ -643,24 +615,10 @@ int read_tone_fetched(void **fetched, void *buffer, int codec, int len, signed l if (*left < len) len = *left; - switch(codec) - { - case CODEC_LAW: - memcpy(buffer, *fetched, len); - *((char **)fetched) += len; - l = len; - break; - case CODEC_MONO: - memcpy(buffer, *fetched, len<<1); - *((char **)fetched) += len<<1; - l = len; - break; - - default: - PERROR("codec %d is not specified or supported, exitting...\n", codec); - exit(-1); - } + memcpy(buffer, *fetched, len); + *((char **)fetched) += len; + l = len; if (l>0 && left) *left -= l;