^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * Audio support data for ISDN4Linux.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright Andreas Eversberg (jolly@eversberg.eu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * This software may be used and distributed according to the terms
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * of the GNU General Public License, incorporated herein by reference.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/gfp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/mISDNif.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/mISDNdsp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include "core.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include "dsp.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define DATA_S sample_silence
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define SIZE_S (&sizeof_silence)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define DATA_GA sample_german_all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define SIZE_GA (&sizeof_german_all)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define DATA_GO sample_german_old
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define SIZE_GO (&sizeof_german_old)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define DATA_DT sample_american_dialtone
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define SIZE_DT (&sizeof_american_dialtone)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define DATA_RI sample_american_ringing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define SIZE_RI (&sizeof_american_ringing)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define DATA_BU sample_american_busy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define SIZE_BU (&sizeof_american_busy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define DATA_S1 sample_special1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define SIZE_S1 (&sizeof_special1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define DATA_S2 sample_special2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define SIZE_S2 (&sizeof_special2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define DATA_S3 sample_special3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define SIZE_S3 (&sizeof_special3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) /***************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) /* tones loops */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) /***************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) /* all tones are alaw encoded */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) /* the last sample+1 is in phase with the first sample. the error is low */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) static u8 sample_german_all[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) 0x80, 0xab, 0x81, 0x6d, 0xfd, 0xdd, 0x5d, 0x9d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) 0x4d, 0xd1, 0x89, 0x88, 0xd0, 0x4c, 0x9c, 0x5c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) 0xdc, 0xfc, 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) 0x80, 0xab, 0x81, 0x6d, 0xfd, 0xdd, 0x5d, 0x9d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) 0x4d, 0xd1, 0x89, 0x88, 0xd0, 0x4c, 0x9c, 0x5c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) 0xdc, 0xfc, 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) 0x80, 0xab, 0x81, 0x6d, 0xfd, 0xdd, 0x5d, 0x9d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) 0x4d, 0xd1, 0x89, 0x88, 0xd0, 0x4c, 0x9c, 0x5c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) 0xdc, 0xfc, 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) 0x80, 0xab, 0x81, 0x6d, 0xfd, 0xdd, 0x5d, 0x9d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) 0x4d, 0xd1, 0x89, 0x88, 0xd0, 0x4c, 0x9c, 0x5c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) 0xdc, 0xfc, 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) static u32 sizeof_german_all = sizeof(sample_german_all);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) static u8 sample_german_old[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) 0xec, 0x68, 0xe1, 0x6d, 0x6d, 0x91, 0x51, 0xed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) 0x6d, 0x01, 0x1e, 0x10, 0x0c, 0x90, 0x60, 0x70,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) 0x8c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) 0xec, 0x68, 0xe1, 0x6d, 0x6d, 0x91, 0x51, 0xed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) 0x6d, 0x01, 0x1e, 0x10, 0x0c, 0x90, 0x60, 0x70,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) 0x8c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) 0xec, 0x68, 0xe1, 0x6d, 0x6d, 0x91, 0x51, 0xed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) 0x6d, 0x01, 0x1e, 0x10, 0x0c, 0x90, 0x60, 0x70,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) 0x8c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) 0xec, 0x68, 0xe1, 0x6d, 0x6d, 0x91, 0x51, 0xed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) 0x6d, 0x01, 0x1e, 0x10, 0x0c, 0x90, 0x60, 0x70,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) 0x8c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) static u32 sizeof_german_old = sizeof(sample_german_old);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) static u8 sample_american_dialtone[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) 0x2a, 0x18, 0x90, 0x6c, 0x4c, 0xbc, 0x4c, 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) 0x10, 0x58, 0x32, 0xb9, 0x31, 0x2d, 0x8d, 0x0d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) 0x8d, 0x2d, 0x31, 0x99, 0x0f, 0x28, 0x60, 0xf0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) 0xd0, 0x50, 0xd0, 0x30, 0x60, 0x08, 0x8e, 0x67,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) 0x09, 0x19, 0x21, 0xe1, 0xd9, 0xb9, 0x29, 0x67,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) 0x83, 0x02, 0xce, 0xbe, 0xee, 0x1a, 0x1b, 0xef,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) 0xbf, 0xcf, 0x03, 0x82, 0x66, 0x28, 0xb8, 0xd8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) 0xe0, 0x20, 0x18, 0x08, 0x66, 0x8f, 0x09, 0x61,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) 0x31, 0xd1, 0x51, 0xd1, 0xf1, 0x61, 0x29, 0x0e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) 0x98, 0x30, 0x2c, 0x8c, 0x0c, 0x8c, 0x2c, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) 0xb8, 0x33, 0x59, 0x11, 0x6d, 0x4d, 0xbd, 0x4d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) 0x6d, 0x91, 0x19,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) static u32 sizeof_american_dialtone = sizeof(sample_american_dialtone);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) static u8 sample_american_ringing[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) 0x2a, 0xe0, 0xac, 0x0c, 0xbc, 0x4c, 0x8c, 0x90,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) 0x48, 0xc7, 0xc1, 0xed, 0xcd, 0x4d, 0xcd, 0xed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) 0xc1, 0xb7, 0x08, 0x30, 0xec, 0xcc, 0xcc, 0x8c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) 0x10, 0x58, 0x1a, 0x99, 0x71, 0xed, 0x8d, 0x8d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) 0x2d, 0x41, 0x89, 0x9e, 0x20, 0x70, 0x2c, 0xec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) 0x2c, 0x70, 0x20, 0x86, 0x77, 0xe1, 0x31, 0x11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) 0xd1, 0xf1, 0x81, 0x09, 0xa3, 0x56, 0x58, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 0x40, 0xc0, 0x60, 0x38, 0x46, 0x43, 0x57, 0x39,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 0xd9, 0x59, 0x99, 0xc9, 0x77, 0x2f, 0x2e, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 0xd6, 0x28, 0xd6, 0x36, 0x26, 0x2e, 0x8a, 0xa3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 0x43, 0x63, 0x4b, 0x4a, 0x62, 0x42, 0xa2, 0x8b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 0x2f, 0x27, 0x37, 0xd7, 0x29, 0xd7, 0xc7, 0x2f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 0x2e, 0x76, 0xc8, 0x98, 0x58, 0xd8, 0x38, 0x56,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 0x42, 0x47, 0x39, 0x61, 0xc1, 0x41, 0x01, 0x59,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 0x57, 0xa2, 0x08, 0x80, 0xf0, 0xd0, 0x10, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 0xe0, 0x76, 0x87, 0x21, 0x71, 0x2d, 0xed, 0x2d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 0x71, 0x21, 0x9f, 0x88, 0x40, 0x2c, 0x8c, 0x8c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 0xec, 0x70, 0x98, 0x1b, 0x59, 0x11, 0x8d, 0xcd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 0xcd, 0xed, 0x31, 0x09, 0xb6, 0xc0, 0xec, 0xcc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 0x4c, 0xcc, 0xec, 0xc0, 0xc6, 0x49, 0x91, 0x8d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 0x4d, 0xbd, 0x0d, 0xad, 0xe1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) static u32 sizeof_american_ringing = sizeof(sample_american_ringing);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) static u8 sample_american_busy[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 0x2a, 0x00, 0x6c, 0x4c, 0x4c, 0x6c, 0xb0, 0x66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 0x99, 0x11, 0x6d, 0x8d, 0x2d, 0x41, 0xd7, 0x96,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 0x60, 0xf0, 0x70, 0x40, 0x58, 0xf6, 0x53, 0x57,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 0x09, 0x89, 0xd7, 0x5f, 0xe3, 0x2a, 0xe3, 0x5f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 0xd7, 0x89, 0x09, 0x57, 0x53, 0xf6, 0x58, 0x40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 0x70, 0xf0, 0x60, 0x96, 0xd7, 0x41, 0x2d, 0x8d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 0x6d, 0x11, 0x99, 0x66, 0xb0, 0x6c, 0x4c, 0x4c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 0x6c, 0x00, 0x2a, 0x01, 0x6d, 0x4d, 0x4d, 0x6d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 0xb1, 0x67, 0x98, 0x10, 0x6c, 0x8c, 0x2c, 0x40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 0xd6, 0x97, 0x61, 0xf1, 0x71, 0x41, 0x59, 0xf7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 0x52, 0x56, 0x08, 0x88, 0xd6, 0x5e, 0xe2, 0x2a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 0xe2, 0x5e, 0xd6, 0x88, 0x08, 0x56, 0x52, 0xf7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 0x59, 0x41, 0x71, 0xf1, 0x61, 0x97, 0xd6, 0x40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 0x2c, 0x8c, 0x6c, 0x10, 0x98, 0x67, 0xb1, 0x6d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 0x4d, 0x4d, 0x6d, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) static u32 sizeof_american_busy = sizeof(sample_american_busy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) static u8 sample_special1[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 0x2a, 0x2c, 0xbc, 0x6c, 0xd6, 0x71, 0xbd, 0x0d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 0xd9, 0x80, 0xcc, 0x4c, 0x40, 0x39, 0x0d, 0xbd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 0x11, 0x86, 0xec, 0xbc, 0xec, 0x0e, 0x51, 0xbd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 0x8d, 0x89, 0x30, 0x4c, 0xcc, 0xe0, 0xe1, 0xcd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 0x4d, 0x31, 0x88, 0x8c, 0xbc, 0x50, 0x0f, 0xed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 0xbd, 0xed, 0x87, 0x10, 0xbc, 0x0c, 0x38, 0x41,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 0x4d, 0xcd, 0x81, 0xd8, 0x0c, 0xbc, 0x70, 0xd7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 0x6d, 0xbd, 0x2d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) static u32 sizeof_special1 = sizeof(sample_special1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) static u8 sample_special2[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 0x2a, 0xcc, 0x8c, 0xd7, 0x4d, 0x2d, 0x18, 0xbc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 0x10, 0xc1, 0xbd, 0xc1, 0x10, 0xbc, 0x18, 0x2d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 0x4d, 0xd7, 0x8c, 0xcc, 0x2a, 0xcd, 0x8d, 0xd6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 0x4c, 0x2c, 0x19, 0xbd, 0x11, 0xc0, 0xbc, 0xc0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 0x11, 0xbd, 0x19, 0x2c, 0x4c, 0xd6, 0x8d, 0xcd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 0x2a, 0xcc, 0x8c, 0xd7, 0x4d, 0x2d, 0x18, 0xbc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 0x10, 0xc1, 0xbd, 0xc1, 0x10, 0xbc, 0x18, 0x2d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 0x4d, 0xd7, 0x8c, 0xcc, 0x2a, 0xcd, 0x8d, 0xd6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 0x4c, 0x2c, 0x19, 0xbd, 0x11, 0xc0, 0xbc, 0xc0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 0x11, 0xbd, 0x19, 0x2c, 0x4c, 0xd6, 0x8d, 0xcd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) static u32 sizeof_special2 = sizeof(sample_special2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) static u8 sample_special3[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 0x2a, 0xbc, 0x18, 0xcd, 0x11, 0x2c, 0x8c, 0xc1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 0x4d, 0xd6, 0xbc, 0xd6, 0x4d, 0xc1, 0x8c, 0x2c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 0x11, 0xcd, 0x18, 0xbc, 0x2a, 0xbd, 0x19, 0xcc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 0x10, 0x2d, 0x8d, 0xc0, 0x4c, 0xd7, 0xbd, 0xd7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 0x4c, 0xc0, 0x8d, 0x2d, 0x10, 0xcc, 0x19, 0xbd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 0x2a, 0xbc, 0x18, 0xcd, 0x11, 0x2c, 0x8c, 0xc1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 0x4d, 0xd6, 0xbc, 0xd6, 0x4d, 0xc1, 0x8c, 0x2c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 0x11, 0xcd, 0x18, 0xbc, 0x2a, 0xbd, 0x19, 0xcc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 0x10, 0x2d, 0x8d, 0xc0, 0x4c, 0xd7, 0xbd, 0xd7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 0x4c, 0xc0, 0x8d, 0x2d, 0x10, 0xcc, 0x19, 0xbd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) static u32 sizeof_special3 = sizeof(sample_special3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) static u8 sample_silence[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) static u32 sizeof_silence = sizeof(sample_silence);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) struct tones_samples {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) u32 *len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) u8 *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) static struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) tones_samples samples[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) {&sizeof_german_all, sample_german_all},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) {&sizeof_german_old, sample_german_old},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) {&sizeof_american_dialtone, sample_american_dialtone},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) {&sizeof_american_ringing, sample_american_ringing},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) {&sizeof_american_busy, sample_american_busy},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) {&sizeof_special1, sample_special1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) {&sizeof_special2, sample_special2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) {&sizeof_special3, sample_special3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) {NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) /***********************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) * generate ulaw from alaw samples *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) ***********************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) dsp_audio_generate_ulaw_samples(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) int i, j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) while (samples[i].len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) j = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) while (j < (*samples[i].len)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) samples[i].data[j] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) dsp_audio_alaw_to_ulaw[samples[i].data[j]];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) j++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) /****************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) * tone sequence definition *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) ****************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) static struct pattern {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) int tone;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) u8 *data[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) u32 *siz[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) u32 seq[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) } pattern[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) {TONE_GERMAN_DIALTONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) {DATA_GA, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) {SIZE_GA, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) {1900, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) {TONE_GERMAN_OLDDIALTONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) {DATA_GO, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) {SIZE_GO, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) {1998, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) {TONE_AMERICAN_DIALTONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) {DATA_DT, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) {SIZE_DT, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) {8000, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) {TONE_GERMAN_DIALPBX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) {DATA_GA, DATA_S, DATA_GA, DATA_S, DATA_GA, DATA_S, NULL, NULL, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) {SIZE_GA, SIZE_S, SIZE_GA, SIZE_S, SIZE_GA, SIZE_S, NULL, NULL, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) {2000, 2000, 2000, 2000, 2000, 12000, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) {TONE_GERMAN_OLDDIALPBX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) {DATA_GO, DATA_S, DATA_GO, DATA_S, DATA_GO, DATA_S, NULL, NULL, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) {SIZE_GO, SIZE_S, SIZE_GO, SIZE_S, SIZE_GO, SIZE_S, NULL, NULL, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) {2000, 2000, 2000, 2000, 2000, 12000, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) {TONE_AMERICAN_DIALPBX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) {DATA_DT, DATA_S, DATA_DT, DATA_S, DATA_DT, DATA_S, NULL, NULL, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) {SIZE_DT, SIZE_S, SIZE_DT, SIZE_S, SIZE_DT, SIZE_S, NULL, NULL, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) {2000, 2000, 2000, 2000, 2000, 12000, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) {TONE_GERMAN_RINGING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) {DATA_GA, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) {SIZE_GA, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) {8000, 32000, 0, 0, 0, 0, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) {TONE_GERMAN_OLDRINGING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) {DATA_GO, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) {SIZE_GO, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) {8000, 40000, 0, 0, 0, 0, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) {TONE_AMERICAN_RINGING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) {DATA_RI, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) {SIZE_RI, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) {8000, 32000, 0, 0, 0, 0, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) {TONE_GERMAN_RINGPBX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) {DATA_GA, DATA_S, DATA_GA, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) {SIZE_GA, SIZE_S, SIZE_GA, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) {4000, 4000, 4000, 28000, 0, 0, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) {TONE_GERMAN_OLDRINGPBX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) {DATA_GO, DATA_S, DATA_GO, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) {SIZE_GO, SIZE_S, SIZE_GO, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) {4000, 4000, 4000, 28000, 0, 0, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) {TONE_AMERICAN_RINGPBX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) {DATA_RI, DATA_S, DATA_RI, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) {SIZE_RI, SIZE_S, SIZE_RI, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) {4000, 4000, 4000, 28000, 0, 0, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) {TONE_GERMAN_BUSY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) {DATA_GA, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) {SIZE_GA, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) {4000, 4000, 0, 0, 0, 0, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) {TONE_GERMAN_OLDBUSY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) {DATA_GO, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) {SIZE_GO, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) {1000, 5000, 0, 0, 0, 0, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) {TONE_AMERICAN_BUSY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) {DATA_BU, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) {SIZE_BU, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) {4000, 4000, 0, 0, 0, 0, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) {TONE_GERMAN_HANGUP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) {DATA_GA, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) {SIZE_GA, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) {4000, 4000, 0, 0, 0, 0, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) {TONE_GERMAN_OLDHANGUP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) {DATA_GO, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) {SIZE_GO, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) {1000, 5000, 0, 0, 0, 0, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) {TONE_AMERICAN_HANGUP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) {DATA_DT, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) {SIZE_DT, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) {8000, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) {TONE_SPECIAL_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) {DATA_S1, DATA_S2, DATA_S3, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) {SIZE_S1, SIZE_S2, SIZE_S3, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) {2666, 2666, 2666, 8002, 0, 0, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) {TONE_GERMAN_GASSENBESETZT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) {DATA_GA, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) {SIZE_GA, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) {2000, 2000, 0, 0, 0, 0, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) {TONE_GERMAN_AUFSCHALTTON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) {DATA_GO, DATA_S, DATA_GO, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) {SIZE_GO, SIZE_S, SIZE_GO, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) {1000, 5000, 1000, 17000, 0, 0, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) {0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) /******************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) * copy tone data *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) ******************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) /* an sk_buff is generated from the number of samples needed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) * the count will be changed and may begin from 0 each pattern period.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) * the clue is to precalculate the pointers and legths to use only one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) * memcpy per function call, or two memcpy if the tone sequence changes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) * pattern - the type of the pattern
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) * count - the sample from the beginning of the pattern (phase)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) * len - the number of bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) * return - the sk_buff with the sample
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) * if tones has finished (e.g. knocking tone), dsp->tones is turned off
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) void dsp_tone_copy(struct dsp *dsp, u8 *data, int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) int index, count, start, num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) struct pattern *pat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) struct dsp_tone *tone = &dsp->tone;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) /* if we have no tone, we copy silence */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) if (!tone->tone) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) memset(data, dsp_silence, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) /* process pattern */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) pat = (struct pattern *)tone->pattern;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) /* points to the current pattern */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) index = tone->index; /* gives current sequence index */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) count = tone->count; /* gives current sample */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) /* copy sample */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) while (len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) /* find sample to start with */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) while (42) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) /* wrap around */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) if (!pat->seq[index]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) /* check if we are currently playing this tone */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) if (count < pat->seq[index])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) if (dsp_debug & DEBUG_DSP_TONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) printk(KERN_DEBUG "%s: reaching next sequence "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) "(index=%d)\n", __func__, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) count -= pat->seq[index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) /* calculate start and number of samples */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) start = count % (*(pat->siz[index]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) num = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) if (num + count > pat->seq[index])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) num = pat->seq[index] - count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) if (num + start > (*(pat->siz[index])))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) num = (*(pat->siz[index])) - start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) /* copy memory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) memcpy(data, pat->data[index] + start, num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) /* reduce length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) data += num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) count += num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) len -= num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) tone->index = index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) tone->count = count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) /* return sk_buff */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) /*******************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) * send HW message to hfc card *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) *******************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) dsp_tone_hw_message(struct dsp *dsp, u8 *sample, int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) struct sk_buff *nskb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) /* unlocking is not required, because we don't expect a response */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) nskb = _alloc_mISDN_skb(PH_CONTROL_REQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) (len) ? HFC_SPL_LOOP_ON : HFC_SPL_LOOP_OFF, len, sample,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) if (nskb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) if (dsp->ch.peer) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) if (dsp->ch.recv(dsp->ch.peer, nskb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) dev_kfree_skb(nskb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) dev_kfree_skb(nskb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) /*****************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) * timer expires *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) *****************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) dsp_tone_timeout(struct timer_list *t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) struct dsp *dsp = from_timer(dsp, t, tone.tl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) struct dsp_tone *tone = &dsp->tone;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) struct pattern *pat = (struct pattern *)tone->pattern;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) int index = tone->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) if (!tone->tone)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) if (!pat->seq[index])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) tone->index = index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) /* set next tone */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) if (pat->data[index] == DATA_S)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) dsp_tone_hw_message(dsp, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) dsp_tone_hw_message(dsp, pat->data[index], *(pat->siz[index]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) /* set timer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) tone->tl.expires = jiffies + (pat->seq[index] * HZ) / 8000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) add_timer(&tone->tl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) /********************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) * set/release tone *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) ********************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) * tones are relaized by streaming or by special loop commands if supported
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) * by hardware. when hardware is used, the patterns will be controlled by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) * timers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) dsp_tone(struct dsp *dsp, int tone)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) struct pattern *pat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) struct dsp_tone *tonet = &dsp->tone;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) tonet->software = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) tonet->hardware = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) /* we turn off the tone */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) if (!tone) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) if (dsp->features.hfc_loops && timer_pending(&tonet->tl))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) del_timer(&tonet->tl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) if (dsp->features.hfc_loops)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) dsp_tone_hw_message(dsp, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) tonet->tone = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) pat = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) while (pattern[i].tone) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) if (pattern[i].tone == tone) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) pat = &pattern[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) if (!pat) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) printk(KERN_WARNING "dsp: given tone 0x%x is invalid\n", tone);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) if (dsp_debug & DEBUG_DSP_TONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) printk(KERN_DEBUG "%s: now starting tone %d (index=%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) __func__, tone, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) tonet->tone = tone;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) tonet->pattern = pat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) tonet->index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) tonet->count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) if (dsp->features.hfc_loops) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) tonet->hardware = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) /* set first tone */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) dsp_tone_hw_message(dsp, pat->data[0], *(pat->siz[0]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) /* set timer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) if (timer_pending(&tonet->tl))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) del_timer(&tonet->tl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) tonet->tl.expires = jiffies + (pat->seq[0] * HZ) / 8000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) add_timer(&tonet->tl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) tonet->software = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) }