Changeset 78aca91b in mainline
- Timestamp:
- 2013-04-06T18:02:40Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 98af9cc
- Parents:
- 2c0b348
- Location:
- uspace/srv/audio/hound
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/audio/hound/hound_ctx.c
r2c0b348 r78aca91b 111 111 int flags; 112 112 size_t allowed_size; 113 fibril_mutex_t guard; 114 fibril_condvar_t change; 113 115 } hound_ctx_stream_t; 114 116 … … 144 146 audio_pipe_init(&stream->fifo); 145 147 link_initialize(&stream->link); 148 fibril_mutex_initialize(&stream->guard); 149 fibril_condvar_initialize(&stream->change); 146 150 stream->ctx = ctx; 147 151 stream->flags = flags; … … 182 186 return EINVAL; 183 187 184 if (stream->allowed_size && 185 (audio_pipe_bytes(&stream->fifo) + size > stream->allowed_size)) 186 return EBUSY; 187 188 return audio_pipe_push_data(&stream->fifo, data, size, stream->format); 188 fibril_mutex_lock(&stream->guard); 189 while (stream->allowed_size && 190 (audio_pipe_bytes(&stream->fifo) + size > stream->allowed_size)) { 191 fibril_condvar_wait(&stream->change, &stream->guard); 192 193 } 194 195 const int ret = 196 audio_pipe_push_data(&stream->fifo, data, size, stream->format); 197 fibril_mutex_unlock(&stream->guard); 198 return ret; 189 199 } 190 200 … … 199 209 { 200 210 assert(stream); 201 const ssize_t copied_size =202 203 if (copied_size != (ssize_t)size)204 log_warning("Not enough data in stream buffer");205 return copied_size;211 fibril_mutex_lock(&stream->guard); 212 const int ret = audio_pipe_mix_data(&stream->fifo, data, size, f); 213 fibril_condvar_signal(&stream->change); 214 fibril_mutex_unlock(&stream->guard); 215 return ret; 206 216 } 207 217 … … 210 220 assert(stream); 211 221 log_debug("Draining stream"); 222 fibril_mutex_lock(&stream->guard); 212 223 while (audio_pipe_bytes(&stream->fifo)) 213 async_usleep(10000); 224 fibril_condvar_wait(&stream->change, &stream->guard); 225 fibril_mutex_unlock(&stream->guard); 214 226 } 215 227 … … 233 245 list_foreach(ctx->streams, it) { 234 246 hound_ctx_stream_t *stream = hound_ctx_stream_from_link(it); 235 hound_ctx_stream_add_self(stream, buffer, size, &source->format); 247 ssize_t copied = hound_ctx_stream_add_self( 248 stream, buffer, size, &source->format); 249 if (copied != (ssize_t)size) 250 log_warning("Not enough data in stream buffer"); 236 251 } 237 252 log_verbose("CTX: %p. Pushing audio to %zu connections", ctx, -
uspace/srv/audio/hound/iface.c
r2c0b348 r78aca91b 83 83 if (!ctx) 84 84 return false; 85 log_info("%s: %p, %d", __FUNCTION__, server, id);86 85 return hound_ctx_is_record(ctx); 87 86 } … … 150 149 static int iface_stream_data_write(void *stream, const void *buffer, size_t size) 151 150 { 152 int ret = EOK; 153 do { 154 ret = hound_ctx_stream_write(stream, buffer, size); 155 } while (ret == EBUSY && (async_usleep(100), 1)); 156 return ret; 151 return hound_ctx_stream_write(stream, buffer, size); 157 152 } 158 153
Note:
See TracChangeset
for help on using the changeset viewer.