FreeCalypso > hg > sipout-test-utils
annotate test-voice/rtp_tx.c @ 17:830af7de3403
sipout-test-voice: disallow empty files for play command
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Mon, 13 May 2024 22:31:24 -0800 | 
| parents | 71f01a834820 | 
| children | 
| rev | line source | 
|---|---|
| 0 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 1 /* | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 2 * In this module we implement outgoing RTP stream generation. | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 3 */ | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 4 | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 5 #include <sys/types.h> | 
| 14 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 6 #include <sys/file.h> | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 7 #include <sys/stat.h> | 
| 0 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 8 #include <sys/socket.h> | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 9 #include <sys/time.h> | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 10 #include <netinet/in.h> | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 11 #include <stdio.h> | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 12 #include <stdint.h> | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 13 #include <stdlib.h> | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 14 #include <string.h> | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 15 #include <strings.h> | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 16 #include <unistd.h> | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 17 #include "../include/tmgw_const.h" | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 18 #include "../include/rtp_defs.h" | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 19 #include "../libutil/osmo_bits.h" | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 20 | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 21 extern struct sockaddr_in rtp_local_addr, rtp_remote_addr; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 22 extern int rtp_udp_fd, rtcp_udp_fd, pcma_selected; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 23 extern struct timeval cur_event_time; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 24 | 
| 13 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 25 static const uint8_t dmw_alaw[8] = | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 26 {0x34, 0x21, 0x21, 0x34, 0xB4, 0xA1, 0xA1, 0xB4}; | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 27 static const uint8_t dmw_ulaw[8] = | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 28 {0x1E, 0x0B, 0x0B, 0x1E, 0x9E, 0x8B, 0x8B, 0x9E}; | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 29 | 
| 0 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 30 static uint32_t rtp_ssrc; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 31 static uint32_t rtp_out_ts; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 32 static uint16_t rtp_out_seq; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 33 | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 34 static uint8_t pcm_fill_octet; | 
| 13 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 35 static int dmw_active; | 
| 0 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 36 | 
| 14 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 37 static uint8_t *play_buffer; | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 38 static unsigned play_buf_nframes, play_buf_ptr; | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 39 static int play_loop; | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 40 | 
| 0 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 41 static uint16_t tfo_fill_buf[9], tfo_req_buf[7]; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 42 static uint16_t *is_out_ptr; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 43 static unsigned is_out_count; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 44 static int tfo_stop_req; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 45 | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 46 void | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 47 assign_rtpout_ssrc() | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 48 { | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 49 rtp_ssrc = cur_event_time.tv_sec ^ cur_event_time.tv_usec ^ getpid(); | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 50 } | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 51 | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 52 void | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 53 init_pcm_fill_octet() | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 54 { | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 55 if (pcma_selected) | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 56 pcm_fill_octet = 0xD5; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 57 else | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 58 pcm_fill_octet = 0xFF; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 59 } | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 60 | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 61 void | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 62 prepare_tfo_fill() | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 63 { | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 64 tfo_fill_buf[0] = 0x15A; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 65 tfo_fill_buf[1] = 0x1A9; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 66 tfo_fill_buf[2] = 0x129; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 67 tfo_fill_buf[3] = 0x15A; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 68 tfo_fill_buf[4] = 0x1A9; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 69 tfo_fill_buf[5] = 0x129; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 70 tfo_fill_buf[6] = 0x15A; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 71 tfo_fill_buf[7] = 0x1A9; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 72 tfo_fill_buf[8] = 0x129; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 73 } | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 74 | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 75 static void | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 76 insert_is_msg(payload, word) | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 77 uint8_t *payload; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 78 uint16_t word; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 79 { | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 80 ubit_t is_bits[10]; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 81 uint8_t *bytep; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 82 unsigned n; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 83 | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 84 uint16_to_bits(word, is_bits, 10); | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 85 for (n = 0; n < 10; n++) { | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 86 bytep = payload + n * 16; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 87 *bytep &= 0xFE; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 88 *bytep |= is_bits[n]; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 89 } | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 90 } | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 91 | 
| 13 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 92 static void | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 93 fill_with_dmw(buf) | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 94 uint8_t *buf; | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 95 { | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 96 const uint8_t *src; | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 97 unsigned n; | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 98 | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 99 if (pcma_selected) | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 100 src = dmw_alaw; | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 101 else | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 102 src = dmw_ulaw; | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 103 for (n = 0; n < 20; n++) { | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 104 memcpy(buf, src, 8); | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 105 buf += 8; | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 106 } | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 107 } | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 108 | 
| 14 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 109 static void | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 110 fill_with_play(outbuf) | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 111 uint8_t *outbuf; | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 112 { | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 113 memcpy(outbuf, play_buffer + play_buf_ptr * 160, 160); | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 114 play_buf_ptr++; | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 115 if (play_buf_ptr < play_buf_nframes) | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 116 return; | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 117 if (play_loop) | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 118 play_buf_ptr = 0; | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 119 else { | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 120 free(play_buffer); | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 121 play_buffer = 0; | 
| 15 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 122 printf("file play finished\n"); | 
| 14 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 123 } | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 124 } | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 125 | 
| 0 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 126 void | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 127 generate_rtp_packet() | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 128 { | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 129 struct rtp_packet pkt; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 130 socklen_t addrlen; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 131 | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 132 pkt.v_p_x_cc = 0x80; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 133 pkt.m_pt = pcma_selected ? PSTN_CODEC_PCMA : PSTN_CODEC_PCMU; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 134 pkt.seq = htons(rtp_out_seq++); | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 135 pkt.tstamp = htonl(rtp_out_ts); | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 136 rtp_out_ts += 160; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 137 pkt.ssrc = rtp_ssrc; | 
| 14 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 138 if (play_buffer) | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 139 fill_with_play(pkt.payload); | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 140 else if (dmw_active) | 
| 13 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 141 fill_with_dmw(pkt.payload); | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 142 else | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 143 memset(pkt.payload, pcm_fill_octet, RTP_MAX_PAYLOAD); | 
| 0 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 144 if (is_out_count) { | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 145 insert_is_msg(pkt.payload, *is_out_ptr++); | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 146 is_out_count--; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 147 if (!is_out_count && !tfo_stop_req) { | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 148 is_out_ptr = tfo_req_buf; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 149 is_out_count = 7; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 150 } | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 151 } | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 152 addrlen = sizeof(struct sockaddr_in); | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 153 sendto(rtp_udp_fd, &pkt, RTP_PACKET_SIZE_PSTN, 0, | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 154 (struct sockaddr *) &rtp_remote_addr, addrlen); | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 155 } | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 156 | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 157 void | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 158 set_pcm_fill_octet(oct) | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 159 unsigned oct; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 160 { | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 161 pcm_fill_octet = oct; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 162 } | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 163 | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 164 void | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 165 send_tfo_req(sig, codec) | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 166 unsigned sig, codec; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 167 { | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 168 tfo_req_buf[0] = 0x15A; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 169 tfo_req_buf[1] = 0x1A9; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 170 tfo_req_buf[2] = 0x05D; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 171 tfo_req_buf[3] = 0x14E; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 172 tfo_req_buf[4] = 0x14B; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 173 encode_tfo_ext_words(sig, codec, 0, tfo_req_buf + 5); | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 174 is_out_ptr = tfo_fill_buf; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 175 is_out_count = 9; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 176 tfo_stop_req = 0; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 177 } | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 178 | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 179 void | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 180 stop_tfo_out() | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 181 { | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 182 tfo_stop_req = 1; | 
| 
35c0d9f03c0a
beginning with sipout-test-voice,
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 183 } | 
| 13 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 184 | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 185 void | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 186 cmd_dmw_on() | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 187 { | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 188 dmw_active = 1; | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 189 } | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 190 | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 191 void | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 192 cmd_dmw_off() | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 193 { | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 194 dmw_active = 0; | 
| 
059b79c9f0c3
sipout-test-voice: add DMW output mode
 Mychaela Falconia <falcon@freecalypso.org> parents: 
0diff
changeset | 195 } | 
| 14 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 196 | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 197 void | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 198 play_file_cmdop(filename, loop) | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 199 char *filename; | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 200 { | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 201 int fd; | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 202 struct stat st; | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 203 | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 204 if (play_buffer) { | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 205 fprintf(stderr, "error: file play already in progress\n"); | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 206 return; | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 207 } | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 208 fd = open(filename, O_RDONLY); | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 209 if (fd < 0) { | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 210 perror(filename); | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 211 return; | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 212 } | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 213 fstat(fd, &st); | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 214 if (!S_ISREG(st.st_mode)) { | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 215 close(fd); | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 216 fprintf(stderr, "error: %s is not a regular file\n", filename); | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 217 return; | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 218 } | 
| 17 
830af7de3403
sipout-test-voice: disallow empty files for play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
15diff
changeset | 219 if (!st.st_size) { | 
| 
830af7de3403
sipout-test-voice: disallow empty files for play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
15diff
changeset | 220 close(fd); | 
| 
830af7de3403
sipout-test-voice: disallow empty files for play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
15diff
changeset | 221 fprintf(stderr, "error: %s is an empty file\n", filename); | 
| 
830af7de3403
sipout-test-voice: disallow empty files for play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
15diff
changeset | 222 return; | 
| 
830af7de3403
sipout-test-voice: disallow empty files for play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
15diff
changeset | 223 } | 
| 14 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 224 if (st.st_size % 160) { | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 225 close(fd); | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 226 fprintf(stderr, | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 227 "error: size of %s is not a multiple of 160 bytes\n", | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 228 filename); | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 229 return; | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 230 } | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 231 play_buffer = malloc(st.st_size); | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 232 if (!play_buffer) { | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 233 close(fd); | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 234 fprintf(stderr, "unable to malloc buffer for %s\n", filename); | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 235 return; | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 236 } | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 237 read(fd, play_buffer, st.st_size); | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 238 close(fd); | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 239 play_buf_nframes = st.st_size / 160; | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 240 play_buf_ptr = 0; | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 241 play_loop = loop; | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 242 } | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 243 | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 244 void | 
| 15 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 245 play_file_offset(filename, offset) | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 246 char *filename; | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 247 unsigned offset; | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 248 { | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 249 int fd; | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 250 struct stat st; | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 251 unsigned pre_offset; | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 252 | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 253 if (play_buffer) { | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 254 fprintf(stderr, "error: file play already in progress\n"); | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 255 return; | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 256 } | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 257 fd = open(filename, O_RDONLY); | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 258 if (fd < 0) { | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 259 perror(filename); | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 260 return; | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 261 } | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 262 fstat(fd, &st); | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 263 if (!S_ISREG(st.st_mode)) { | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 264 close(fd); | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 265 fprintf(stderr, "error: %s is not a regular file\n", filename); | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 266 return; | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 267 } | 
| 17 
830af7de3403
sipout-test-voice: disallow empty files for play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
15diff
changeset | 268 if (!st.st_size) { | 
| 
830af7de3403
sipout-test-voice: disallow empty files for play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
15diff
changeset | 269 close(fd); | 
| 
830af7de3403
sipout-test-voice: disallow empty files for play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
15diff
changeset | 270 fprintf(stderr, "error: %s is an empty file\n", filename); | 
| 
830af7de3403
sipout-test-voice: disallow empty files for play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
15diff
changeset | 271 return; | 
| 
830af7de3403
sipout-test-voice: disallow empty files for play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
15diff
changeset | 272 } | 
| 15 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 273 if (st.st_size % 160) { | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 274 close(fd); | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 275 fprintf(stderr, | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 276 "error: size of %s is not a multiple of 160 bytes\n", | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 277 filename); | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 278 return; | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 279 } | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 280 play_buffer = malloc(st.st_size + 160); | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 281 if (!play_buffer) { | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 282 close(fd); | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 283 fprintf(stderr, "unable to malloc buffer for %s\n", filename); | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 284 return; | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 285 } | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 286 pre_offset = 160 - offset; | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 287 memset(play_buffer, pcm_fill_octet, pre_offset); | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 288 read(fd, play_buffer + pre_offset, st.st_size); | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 289 close(fd); | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 290 memset(play_buffer + pre_offset + st.st_size, pcm_fill_octet, offset); | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 291 play_buf_nframes = st.st_size / 160 + 1; | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 292 play_buf_ptr = 0; | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 293 play_loop = 0; | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 294 } | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 295 | 
| 
71f01a834820
sipout-test-voice: implement play with offset
 Mychaela Falconia <falcon@freecalypso.org> parents: 
14diff
changeset | 296 void | 
| 14 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 297 play_file_stop() | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 298 { | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 299 if (!play_buffer) | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 300 return; | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 301 free(play_buffer); | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 302 play_buffer = 0; | 
| 
f96153d15889
sipout-test-voice: implement play from file
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 303 } | 
