Changeset 4269:5d6d888aefac in roaraudio
- Timestamp:
- 08/27/10 16:15:13 (14 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/ltm.c
r4266 r4269 36 36 #include "libroar.h" 37 37 38 static int roar_ltm_numbits(int f) { 39 int found = 0; 40 41 while (f) { 42 if ( f & 0x1 ) 43 found++; 44 45 f >>= 1; 46 } 47 48 return found; 49 } 50 51 static int roar_ltm_pack_req(int mt, int window, 52 int * streams, size_t slen, 53 struct roar_message * mes, char ** buf, 54 int regtype) { 55 uint16_t * data; 56 size_t i; 57 58 if ( mt == 0 || streams == NULL || slen == 0 || mes == NULL || buf == NULL ) { 59 roar_errno = ROAR_ERROR_INVAL; 60 return -1; 61 } 62 63 memset(mes, 0, sizeof(struct roar_message)); 64 65 switch (regtype) { 66 case ROAR_LTM_SST_REGISTER: 67 case ROAR_LTM_SST_UNREGISTER: 68 mes->cmd = ROAR_CMD_SET_STREAM_PARA; 69 break; 70 case ROAR_LTM_SST_GET_RAW: 71 mes->cmd = ROAR_CMD_GET_STREAM_PARA; 72 break; 73 default: 74 roar_errno = ROAR_ERROR_NOTSUP; 75 return -1; 76 break; 77 } 78 79 if ( slen == 1 ) { 80 mes->stream = *streams; 81 mes->datalen = 6 * 2; 82 } else { 83 mes->stream = -1; 84 mes->datalen = (6 + slen) * 2; 85 } 86 87 if ( mes->datalen > LIBROAR_BUFFER_MSGDATA ) { 88 roar_errno = ROAR_ERROR_NOTSUP; 89 return -1; 90 } 91 92 *buf = NULL; 93 94 data = (uint16_t*)mes->data; 95 96 data[0] = 0; 97 data[1] = ROAR_STREAM_PARA_LTM; 98 data[2] = regtype; 99 data[3] = window; 100 data[4] = 0; 101 data[5] = mt; 102 103 for (i = 0; i < slen; i++) { 104 data[6+i] = streams[i]; 105 } 106 107 for (i = 0; i < (mes->datalen/2); i++) { 108 data[i] = ROAR_HOST2NET16(data[i]); 109 } 110 111 return 0; 112 } 113 114 static int roar_ltm_regunreg(struct roar_connection * con, int mt, int window, int * streams, size_t slen, int type) { 115 struct roar_message mes; 116 char * buf = NULL; 117 int ret; 118 119 if ( roar_ltm_pack_req(mt, window, streams, slen, &mes, &buf, type) == -1 ) 120 return -1; 121 122 ret = roar_req(con, &mes, &buf); 123 124 if ( buf != NULL ) 125 free(buf); 126 127 if ( ret != -1 ) { 128 if ( mes.cmd != ROAR_CMD_OK ) 129 ret = -1; 130 } 131 132 return ret; 133 } 134 135 int roar_ltm_register(struct roar_connection * con, int mt, int window, int * streams, size_t slen) { 136 return roar_ltm_regunreg(con, mt, window, streams, slen, ROAR_LTM_SST_REGISTER); 137 } 138 int roar_ltm_unregister(struct roar_connection * con, int mt, int window, int * streams, size_t slen) { 139 return roar_ltm_regunreg(con, mt, window, streams, slen, ROAR_LTM_SST_UNREGISTER); 140 } 141 142 ssize_t roar_ltm_get_raw(struct roar_connection * con, 143 int mt, int window, 144 int * streams, size_t slen, 145 void * buf, size_t * buflen, int64_t ** array) { 146 int bits = roar_ltm_numbits(mt); 147 int64_t * buffer = buf; 148 size_t i; 149 150 if ( buflen == NULL ) { 151 roar_errno = ROAR_ERROR_INVAL; 152 return -1; 153 } 154 155 if ( slen == 0 ) { 156 *buflen = 0; 157 return bits; 158 } 159 160 if ( con == NULL || streams == NULL || buf == NULL || array == NULL ) { 161 roar_errno = ROAR_ERROR_INVAL; 162 return -1; 163 } 164 165 if ( *buflen < (bits * slen) ) { 166 roar_errno = ROAR_ERROR_INVAL; 167 return -1; 168 } 169 170 for (i = 0; i < slen; i++) { 171 array[i] = &(buffer[bits*i]); 172 } 173 174 roar_errno = ROAR_ERROR_NOSYS; 175 return -1; 176 } 177 178 int64_t roar_ltm_extract(int64_t * buf, size_t len, int mt, int req) { 179 int have, need; 180 181 roar_err_clear(); 182 183 have = roar_ltm_numbits(req); 184 185 need = roar_ltm_numbits(mt); 186 187 if ( have != 1 || (mt & req) != req || len != (size_t)need || buf == NULL ) { 188 roar_errno = ROAR_ERROR_INVAL; 189 return 0; 190 } 191 192 while (req && (req & 0x1) == 0) { 193 if ( mt & 0x1 ) 194 buf++; 195 196 mt <<= 1; 197 req <<= 1; 198 } 199 200 return *buf; 201 } 202 203 int64_t roar_ltm_extract1(int64_t * buf, size_t len, int mt, int req) { 204 roar_err_clear(); 205 206 if ( buf == NULL || len != 1 || mt != req ) { 207 roar_errno = ROAR_ERROR_INVAL; 208 return 0; 209 } 210 211 return *buf; 212 } 213 38 214 //ll
Note: See TracChangeset
for help on using the changeset viewer.