Changeset 5073:f9b421aec994 in roaraudio
- Timestamp:
- 06/19/11 22:21:38 (13 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/vs.c
r5071 r5073 41 41 42 42 #define LOCAL_CLOCK ROAR_CLOCK_DEFAULT 43 #define ASYNC_QLEN 4 43 44 44 45 #define FLAG_NONE 0x0000 … … 49 50 #define FLAG_FREE_VOL 0x0010 50 51 #define FLAG_DEF_PAUSE 0x0020 52 #define FLAG_ASYNC 0x0040 51 53 #define FLAG_DIR_IN 0x1000 52 54 #define FLAG_DIR_OUT 0x2000 … … 87 89 } latmes; 88 90 struct { 91 size_t lock; 89 92 size_t qlen; 93 int qcmd[ASYNC_QLEN]; 94 int qsubcmd[ASYNC_QLEN]; 90 95 } async; 91 96 }; … … 94 99 95 100 static int _handle_async_req(roar_vs_t * vss, int * error) { 101 struct roar_message mes; 102 char * data = NULL; 103 uint16_t * ud16 = (uint16_t *) mes.data; 104 ssize_t offset; 105 int cmd, subcmd; 106 int i; 107 108 if ( roar_recv_message(vss->con, &mes, &data) == -1 ) { 109 _seterrre(); 110 } 111 112 cmd = vss->async.qcmd[0]; 113 subcmd = vss->async.qsubcmd[0]; 114 vss->async.qlen--; 115 116 for (i = 1; i < ASYNC_QLEN; i++) { 117 vss->async.qcmd[i-1] = vss->async.qcmd[i]; 118 vss->async.qsubcmd[i-1] = vss->async.qsubcmd[i]; 119 } 120 121 if ( mes.cmd == ROAR_CMD_OK ) { 122 switch (cmd) { 123 case ROAR_CMD_GET_STREAM_PARA: 124 if ( subcmd == ROAR_STREAM_PARA_INFO ) { 125 if ( mes.datalen >= 16 ) { 126 for (i = 0; i < mes.datalen/2; i++) { 127 ud16[i] = ROAR_HOST2NET16(ud16[i]); 128 } 129 if ( ud16[0] == 0 || ud16[1] == 1 ) { 130 offset = ud16[7]; 131 offset *= 1000; 132 offset *= vss->info.rate; 133 offset /= 1000000; 134 vss->latmes.last_offset = offset; 135 } 136 } 137 } else { 138 ROAR_WARN("_handle_async_req(vss=%p, error=%p): Got unexpected reply for command GET_STREAM_PARA, subcommand", vss, error, subcmd); 139 } 140 break; 141 case ROAR_CMD_GET_STREAM: 142 vss->latmes.last_offset = mes.pos; // ha, this is a easy one ;) 143 break; 144 default: 145 ROAR_WARN("_handle_async_req(vss=%p, error=%p): Got unexpected reply for command %i", vss, error, cmd); 146 break; 147 } 148 } 149 150 if ( data != NULL ) 151 free(data); 152 96 153 _seterr(ROAR_ERROR_NOSYS); 97 154 return -1; … … 1193 1250 } 1194 1251 } else if ( vios[i].ud.vp == vss->con ) { 1195 roar_sync(vss->con); 1252 if ( vss->async.qlen ) { 1253 _handle_async_req(vss, NULL); 1254 } else { 1255 roar_sync(vss->con); 1256 } 1196 1257 } else if ( vss->file != NULL && vios[i].ud.vp == vss->file ) { 1197 1258 if ( vios[i].eventsa & ROAR_VIO_SELECT_READ )
Note: See TracChangeset
for help on using the changeset viewer.