1 /*****************************************************************************\
5 **---------------------------------------------------------------------------**
6 ** Copyright: Andreas Eversberg **
8 ** opening and reading tone **
10 \*****************************************************************************/
17 CODEC_OFF is a none accepted value
18 CODEC_LAW is 8 bit (1 byte) data 8khz
19 other codecs are 16 bit (2 bytes) data 8khz
20 the read_tone() will return law or 16bit mono. the read_tone will convert all other formats to 16bit mono.
26 * open the tone (don't increase fhuse, since it is done after calling this function)
27 * NOTE: length and left will be set to the number of samples, NOT bytes
30 unsigned short stereo; /* 1 = pcm, 2 = adpcm */
31 unsigned short channels; /* number of channels */
32 unsigned int sample_rate; /* sample rate */
33 unsigned int data_rate; /* data rate */
34 unsigned short bytes_sample; /* bytes per sample (all channels) */
35 unsigned short bits_sample; /* bits per sample (one channel) */
37 int open_tone(char *file, int *codec, signed int *length, signed int *left)
42 unsigned char buffer[256];
44 int channels = 0, bytes = 0;
45 unsigned int size, chunk;
53 /* try to open the law file */
54 SPRINT(filename, "%s.isdn", file);
55 if ((fh = open(filename, O_RDONLY)) >= 0) {
61 PERROR("Link chain too deep: '%s'\n", filename);
64 if (lstat(filename, &_stat) == -1) {
66 PERROR("Cannot stat file: '%s'\n", filename);
69 if (!S_ISLNK(_stat.st_mode)) {
72 if ((linksize=readlink(filename, linkname, sizeof(linkname))) > 0) {
73 linkname[linksize] = '\0';
76 PERROR("Cannot read link information: '%s'\n", filename);
79 if (linkname[0] == '/') /* absolute link */
80 SCPY(filename, linkname);
81 else { /* relative link */
84 while(strchr(p, '/')) {
89 SCAT(filename, linkname);
91 //printf("follow link: %s\n", filename);
95 *length = _stat.st_size;
97 *left = _stat.st_size;
103 /* try to open the wave file */
104 SPRINT(filename, "%s.wav", file);
105 if ((fh = open(filename, O_RDONLY)) >= 0) {
106 /* get wave header */
108 size=(buffer[4]) + (buffer[5]<<8) + (buffer[6]<<16) + (buffer[7]<<24);
109 if (!!strncmp((char *)buffer, "RIFF", 4)) {
112 PERROR("%s is no riff file!\n", filename);
115 // printf("%c%c%c%c size=%ld\n",buffer[0],buffer[1],buffer[2],buffer[3],size);
118 if (!!strncmp((char *)buffer, "WAVE", 4)) {
121 PERROR("%s is no wave file!\n", filename);
125 if (size>0 && size<8) {
128 PERROR("Remaining file size %ld not large enough for next chunk.\n",size);
132 chunk=(buffer[4]) + (buffer[5]<<8) + (buffer[6]<<16) + (buffer[7]<<24);
134 // printf("%c%c%c%c length=%d\n",buffer[0],buffer[1],buffer[2],buffer[3],chunk);
138 PERROR("Chunk '%c%c%c%c' is larger than remainig file size (length=%ld)\n",buffer[0],buffer[1],buffer[2],buffer[3], chunk);
141 if (!strncmp((char *)buffer, "fmt ", 4)) {
145 PERROR("File %s Fmt chunk illegal size.\n", filename);
148 read(fh, buffer, chunk);
149 fmt = (struct fmt *)buffer;
150 if (fmt->channels<1 || fmt->channels>2) {
153 PERROR("File %s Only support one or two channels file.\n", filename);
156 channels = fmt->channels;
157 // printf("Channels: %d\n", channels);
158 if (fmt->sample_rate != 8000) {
159 PERROR("Warning: File %s has sample rate of %ld.\n", filename, fmt->sample_rate);
161 // printf("Sample Rate: %ld\n", fmt->sample_rate);
162 if (fmt->bits_sample!=8 && fmt->bits_sample!=16) {
165 PERROR("File %s has neigher 8 nor 16 bit samples.\n", filename);
168 bytes = (fmt->bits_sample==16)?2:1;
169 // printf("Bit-Resolution: %d\n", bytes*16-16);
172 if (!strncmp((char *)buffer, "data", 4)) {
176 PERROR("File %s No fmt chunk found before data chunk.\n", filename);
179 // printf("Length: %ld samples (%ld.%03ld seconds)\n", chunk/bytes/channels, chunk/bytes/channels/8000, ((chunk/bytes/channels)%8000)*1000/8000);
180 if (bytes==2 && channels==1) {
184 *length = ((signed int)chunk)>>1;
186 *left = ((signed int)chunk)>>1;
187 // printf("left=%d\n",*left);
189 if (bytes==2 && channels==2) {
191 *codec = CODEC_STEREO;
193 *length = ((signed int)chunk)>>2;
195 *left = ((signed int)chunk)>>2;
197 if (bytes==1 && channels==1) {
201 *length = (signed int)chunk;
203 *left = (signed int)chunk;
207 PERROR("File %s Is not MONO8, MONO16 nor STEREO16.\n", filename);
212 // PDEBUG(DEBUG_PORT, "Unknown chunk '%c%c%c%c'\n",buffer[0],buffer[1],buffer[2],buffer[3]);
213 while(chunk > sizeof(buffer)) {
214 read(fh, buffer, sizeof(buffer));
215 chunk -= sizeof(buffer);
218 read(fh, buffer, chunk);
225 PERROR("File %s No fmt chunk found in file.\n", filename);
230 PERROR("File %s No data chunk found in file.\n", filename);
239 * read from tone, check size
240 * the len must be the number of samples, NOT for the bytes to read!!
241 * the data returned is law-code
243 int read_tone(int fh, unsigned char *buffer, int codec, int len, signed int size, signed int *left, int speed)
247 signed short buffer16[len], *buf16 = buffer16;
248 signed short buffer32[len<<1], *buf32 = buffer32;
249 unsigned char buffer8[len], *buf8 = buffer8;
252 //printf("left=%ld\n",*left);
254 /* if no *left is given (law has unknown length) */
259 offset = ((len&(~4)) * (speed-1));
260 lseek(fh, offset, SEEK_CUR); /* step fowards, backwards (len must be round to 4 bytes, to be sure, that 16bit stereo will not drift out of sync)*/
261 *left -= offset; /* correct the current bytes left */
282 l = read(fh, buffer, len); /* as is */
286 l = read(fh, buf16, len<<1);
295 *buffer++ = audio_s16_to_law[sample & 0xffff];
302 l = read(fh, buf32, len<<2);
307 sample += (*buf32++);
312 *buffer++ = audio_s16_to_law[sample & 0xffff];
319 l = read(fh, buf8, len);
322 *buffer++ = audio_s16_to_law[(((*buf8++)<<8)-0x8000) & 0xffff];
329 FATAL("codec %d is not supported.\n", codec);
338 struct toneset *toneset_first = NULL;
343 void free_tones(void)
345 struct toneset *toneset_temp;
346 struct tonesettone *tonesettone_temp;
349 toneset_temp = toneset_first;
350 while(toneset_temp) {
351 tonesettone_temp = toneset_temp->first;
352 while(tonesettone_temp) {
353 temp = tonesettone_temp;
354 tonesettone_temp = tonesettone_temp->next;
355 FREE(temp, sizeof(struct tonesettone));
359 toneset_temp = toneset_temp->next;
360 FREE(temp, sizeof(struct toneset));
363 toneset_first = NULL;
367 * fetch tones as specified in options.conf
369 int fetch_tones(void)
372 struct dirent *dirent;
373 struct toneset **toneset_nextpointer;
374 struct tonesettone **tonesettone_nextpointer;
377 char filename[256], name[256];
380 signed int tone_size, tone_left;
381 unsigned int memory = 0;
385 if (!options.fetch_tones)
388 toneset_nextpointer = &toneset_first;
389 p = options.fetch_tones;
396 if (*p_next == ',') {
404 /* remove trailing / */
405 if (*p) if (p[strlen(p)-1] == '/')
406 p[strlen(p)-1] = '\0';
408 printf("PBX: Fetching tones '%s'\n", p);
409 PDEBUG(DEBUG_PORT, "fetching tones directory '%s'\n", p);
411 *toneset_nextpointer = (struct toneset *)MALLOC(sizeof(struct toneset));
413 memory += sizeof(struct toneset);
414 SCPY((*toneset_nextpointer)->directory, p);
415 tonesettone_nextpointer = &(*toneset_nextpointer)->first;
417 SPRINT(path, "%s/%s", SHARE_DATA, p);
420 PERROR("Tone set not found: '%s'\n", path);
424 while((dirent=readdir(dir))) {
425 SPRINT(name, "%s", dirent->d_name);
427 /* remove .isdn and .wave */
428 if (strlen(name) >= 4) {
429 if (!strcmp(name+strlen(name)-4, ".wav"))
430 name[strlen(name)-4] = '\0';
432 if (strlen(name) >= 5) {
433 if (!strcmp(name+strlen(name)-5, ".isdn"))
434 name[strlen(name)-5] = '\0';
437 SPRINT(filename, "%s/%s", path, name);
440 if (!strcmp(dirent->d_name, "."))
442 if (!strcmp(dirent->d_name, ".."))
446 fh = open_tone(filename, &tone_codec, &tone_size, &tone_left);
448 PERROR("Cannot open file: '%s'\n", filename);
454 PERROR("File has 0-length: '%s'\n", filename);
461 *tonesettone_nextpointer = (struct tonesettone *)MALLOC(sizeof(struct tonesettone)+tone_size);
463 //printf("tone:%s, %ld bytes\n", name, tone_size);
464 memory += sizeof(struct tonesettone)+tone_size;
468 read_tone(fh, (*tonesettone_nextpointer)->data, tone_codec, tone_size, tone_size, &tone_left, 1);
469 (*tonesettone_nextpointer)->size = tone_size;
470 (*tonesettone_nextpointer)->codec = (tone_codec==CODEC_LAW)?CODEC_LAW:CODEC_MONO;
471 SCPY((*tonesettone_nextpointer)->name, name);
476 tonesettone_nextpointer = &((*tonesettone_nextpointer)->next);
479 toneset_nextpointer = &((*toneset_nextpointer)->next);
483 printf("PBX: Memory used for tones: %d bytes (%d samples)\n", memory, samples);
484 PDEBUG(DEBUG_PORT, "Memory used for tones: %ld bytes (%d samples)\n", memory, samples);
491 * opens the fetched tone (if available)
493 void *open_tone_fetched(char *dir, char *file, int *codec, signed int *length, signed int *left)
495 struct toneset *toneset;
496 struct tonesettone *tonesettone;
498 /* if anything fetched */
503 toneset = toneset_first;
505 //printf("1. comparing '%s' with '%s'\n", toneset->directory, dir);
506 if (!strcmp(toneset->directory, dir))
508 toneset = toneset->next;
514 tonesettone = toneset->first;
516 //printf("2. comparing '%s' with '%s'\n", tonesettone->name, file);
517 if (!strcmp(tonesettone->name, file))
519 tonesettone = tonesettone->next;
524 /* return information */
526 *length = tonesettone->size;
528 *left = tonesettone->size;
530 *codec = tonesettone->codec;
531 //printf("size=%ld, data=%08x\n", tonesettone->size, tonesettone->data);
532 return(tonesettone->data);
537 * read from fetched tone, check size
538 * the len must be the number of samples, NOT for the bytes to read!!
540 int read_tone_fetched(void **fetched, void *buffer, int len, signed int size, signed int *left, int speed)
543 //printf("left=%ld\n",*left);
545 /* if no *left is given (law has unknown length) */
555 memcpy(buffer, *fetched, len);
556 *((char **)fetched) += len;