Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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) }