FreeCalypso > hg > ice1-trau-tester
annotate pcm/pcm_tx.c @ 34:f0b026615f3b
abis: forgot to clear tf.dl_ta_usec
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Tue, 13 Aug 2024 23:07:24 +0000 | 
| parents | fa341317c844 | 
| children | 
| rev | line source | 
|---|---|
| 7 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 1 /* | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 2 * In this module we implement PCM Tx toward the TRAU. | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 3 */ | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 4 | 
| 10 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 5 #include <sys/types.h> | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 6 #include <sys/file.h> | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 7 #include <sys/stat.h> | 
| 8 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 8 #include <ctype.h> | 
| 7 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 9 #include <stdint.h> | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 10 #include <stdbool.h> | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 11 #include <stdio.h> | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 12 #include <stdlib.h> | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 13 #include <string.h> | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 14 #include <unistd.h> | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 15 | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 16 #include <osmocom/core/select.h> | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 17 | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 18 #include "globals.h" | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 19 | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 20 static const uint8_t dmw_alaw[8] = | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 21 {0x34, 0x21, 0x21, 0x34, 0xB4, 0xA1, 0xA1, 0xB4}; | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 22 | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 23 static uint8_t pcm_fill_octet = 0x54; | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 24 static bool dmw_active; | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 25 static uint8_t *play_buffer; | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 26 static unsigned play_buf_nframes, play_buf_ptr; | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 27 | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 28 static void fill_with_dmw(uint8_t *buf) | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 29 { | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 30 unsigned n; | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 31 | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 32 for (n = 0; n < 20; n++) { | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 33 memcpy(buf, dmw_alaw, 8); | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 34 buf += 8; | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 35 } | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 36 } | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 37 | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 38 static void fill_with_play(uint8_t *outbuf) | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 39 { | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 40 memcpy(outbuf, play_buffer + play_buf_ptr * 160, 160); | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 41 play_buf_ptr++; | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 42 if (play_buf_ptr < play_buf_nframes) | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 43 return; | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 44 free(play_buffer); | 
| 10 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 45 play_buffer = NULL; | 
| 7 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 46 printf("file play finished\n"); | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 47 } | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 48 | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 49 void transmit_pcm_20ms(void) | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 50 { | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 51 uint8_t buf[160]; | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 52 | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 53 if (play_buffer) | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 54 fill_with_play(buf); | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 55 else if (dmw_active) | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 56 fill_with_dmw(buf); | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 57 else | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 58 memset(buf, pcm_fill_octet, 160); | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 59 write(ts_fd, buf, 160); | 
| 
ca351324187a
pcm: implement Tx on the E1 timeslot
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 60 } | 
| 8 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 61 | 
| 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 62 void cmd_pcm_fill(int argc, char **argv) | 
| 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 63 { | 
| 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 64 u_long val; | 
| 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 65 char *cp; | 
| 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 66 | 
| 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 67 if (argc != 2) { | 
| 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 68 printf("error: pcm-fill command needs 1 argument\n"); | 
| 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 69 return; | 
| 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 70 } | 
| 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 71 if (!isxdigit(argv[1][0])) { | 
| 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 72 inv_arg: printf("error: argument is not a valid hex octet\n"); | 
| 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 73 return; | 
| 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 74 } | 
| 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 75 val = strtoul(argv[1], &cp, 16); | 
| 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 76 if (*cp) | 
| 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 77 goto inv_arg; | 
| 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 78 if (val > 0xFF) | 
| 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 79 goto inv_arg; | 
| 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 80 pcm_fill_octet = val; | 
| 
70aa8cbdbde9
pcm: implement pcm-fill command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
7diff
changeset | 81 } | 
| 9 
e3d16d490ce2
pcm: implement dmw-on and dmw-off commands
 Mychaela Falconia <falcon@freecalypso.org> parents: 
8diff
changeset | 82 | 
| 
e3d16d490ce2
pcm: implement dmw-on and dmw-off commands
 Mychaela Falconia <falcon@freecalypso.org> parents: 
8diff
changeset | 83 void cmd_dmw_on(int argc, char **argv) | 
| 
e3d16d490ce2
pcm: implement dmw-on and dmw-off commands
 Mychaela Falconia <falcon@freecalypso.org> parents: 
8diff
changeset | 84 { | 
| 
e3d16d490ce2
pcm: implement dmw-on and dmw-off commands
 Mychaela Falconia <falcon@freecalypso.org> parents: 
8diff
changeset | 85 dmw_active = true; | 
| 
e3d16d490ce2
pcm: implement dmw-on and dmw-off commands
 Mychaela Falconia <falcon@freecalypso.org> parents: 
8diff
changeset | 86 } | 
| 
e3d16d490ce2
pcm: implement dmw-on and dmw-off commands
 Mychaela Falconia <falcon@freecalypso.org> parents: 
8diff
changeset | 87 | 
| 
e3d16d490ce2
pcm: implement dmw-on and dmw-off commands
 Mychaela Falconia <falcon@freecalypso.org> parents: 
8diff
changeset | 88 void cmd_dmw_off(int argc, char **argv) | 
| 
e3d16d490ce2
pcm: implement dmw-on and dmw-off commands
 Mychaela Falconia <falcon@freecalypso.org> parents: 
8diff
changeset | 89 { | 
| 
e3d16d490ce2
pcm: implement dmw-on and dmw-off commands
 Mychaela Falconia <falcon@freecalypso.org> parents: 
8diff
changeset | 90 dmw_active = false; | 
| 
e3d16d490ce2
pcm: implement dmw-on and dmw-off commands
 Mychaela Falconia <falcon@freecalypso.org> parents: 
8diff
changeset | 91 } | 
| 10 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 92 | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 93 void cmd_play_file(int argc, char **argv) | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 94 { | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 95 int fd; | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 96 struct stat st; | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 97 | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 98 if (argc != 2) { | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 99 printf("error: play command needs 1 argument\n"); | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 100 return; | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 101 } | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 102 if (play_buffer) { | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 103 printf("error: file play already in progress\n"); | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 104 return; | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 105 } | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 106 fd = open(argv[1], O_RDONLY); | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 107 if (fd < 0) { | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 108 perror(argv[1]); | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 109 return; | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 110 } | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 111 fstat(fd, &st); | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 112 if (!S_ISREG(st.st_mode)) { | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 113 close(fd); | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 114 fprintf(stderr, "error: %s is not a regular file\n", argv[1]); | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 115 return; | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 116 } | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 117 if (!st.st_size) { | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 118 close(fd); | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 119 fprintf(stderr, "error: %s is an empty file\n", argv[1]); | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 120 return; | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 121 } | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 122 if (st.st_size % 160) { | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 123 close(fd); | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 124 fprintf(stderr, | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 125 "error: size of %s is not a multiple of 160 bytes\n", | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 126 argv[1]); | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 127 return; | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 128 } | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 129 play_buffer = malloc(st.st_size); | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 130 if (!play_buffer) { | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 131 close(fd); | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 132 fprintf(stderr, "unable to malloc buffer for %s\n", argv[1]); | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 133 return; | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 134 } | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 135 read(fd, play_buffer, st.st_size); | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 136 close(fd); | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 137 play_buf_nframes = st.st_size / 160; | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 138 play_buf_ptr = 0; | 
| 
5cf7818a7d08
pcm: implement play command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
9diff
changeset | 139 } | 
| 11 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 140 | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 141 void cmd_play_offset(int argc, char **argv) | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 142 { | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 143 int fd; | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 144 struct stat st; | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 145 unsigned offset, pre_offset; | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 146 | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 147 if (argc != 3) { | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 148 printf("error: play-offset command needs 2 arguments\n"); | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 149 return; | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 150 } | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 151 if (play_buffer) { | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 152 printf("error: file play already in progress\n"); | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 153 return; | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 154 } | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 155 offset = strtoul(argv[2], NULL, 0); | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 156 if (offset < 1 || offset > 159) { | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 157 printf("error: offset argument out of range\n"); | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 158 return; | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 159 } | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 160 fd = open(argv[1], O_RDONLY); | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 161 if (fd < 0) { | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 162 perror(argv[1]); | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 163 return; | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 164 } | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 165 fstat(fd, &st); | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 166 if (!S_ISREG(st.st_mode)) { | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 167 close(fd); | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 168 fprintf(stderr, "error: %s is not a regular file\n", argv[1]); | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 169 return; | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 170 } | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 171 if (!st.st_size) { | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 172 close(fd); | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 173 fprintf(stderr, "error: %s is an empty file\n", argv[1]); | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 174 return; | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 175 } | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 176 if (st.st_size % 160) { | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 177 close(fd); | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 178 fprintf(stderr, | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 179 "error: size of %s is not a multiple of 160 bytes\n", | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 180 argv[1]); | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 181 return; | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 182 } | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 183 play_buffer = malloc(st.st_size + 160); | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 184 if (!play_buffer) { | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 185 close(fd); | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 186 fprintf(stderr, "unable to malloc buffer for %s\n", argv[1]); | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 187 return; | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 188 } | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 189 pre_offset = 160 - offset; | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 190 memset(play_buffer, pcm_fill_octet, pre_offset); | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 191 read(fd, play_buffer + pre_offset, st.st_size); | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 192 close(fd); | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 193 memset(play_buffer + pre_offset + st.st_size, pcm_fill_octet, offset); | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 194 play_buf_nframes = st.st_size / 160 + 1; | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 195 play_buf_ptr = 0; | 
| 
e149ca1dd14f
pcm: implement play-offset command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
10diff
changeset | 196 } | 
| 12 
27ca01bb5b11
pcm: implement play-stop command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
11diff
changeset | 197 | 
| 
27ca01bb5b11
pcm: implement play-stop command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
11diff
changeset | 198 void cmd_play_stop(int argc, char **argv) | 
| 
27ca01bb5b11
pcm: implement play-stop command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
11diff
changeset | 199 { | 
| 28 
fa341317c844
pcm: fix bug in play-stop command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
12diff
changeset | 200 if (!play_buffer) { | 
| 12 
27ca01bb5b11
pcm: implement play-stop command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
11diff
changeset | 201 printf("error: no file play in progress\n"); | 
| 
27ca01bb5b11
pcm: implement play-stop command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
11diff
changeset | 202 return; | 
| 
27ca01bb5b11
pcm: implement play-stop command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
11diff
changeset | 203 } | 
| 
27ca01bb5b11
pcm: implement play-stop command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
11diff
changeset | 204 free(play_buffer); | 
| 
27ca01bb5b11
pcm: implement play-stop command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
11diff
changeset | 205 play_buffer = NULL; | 
| 
27ca01bb5b11
pcm: implement play-stop command
 Mychaela Falconia <falcon@freecalypso.org> parents: 
11diff
changeset | 206 } | 
