Changeset 5029c788 in mainline
- Timestamp:
- 2013-04-04T16:21:41Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 9e40d443
- Parents:
- 5a6f362
- Location:
- uspace/srv/audio/hound
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/audio/hound/audio_data.c
r5a6f362 r5029c788 55 55 } 56 56 57 audio_data_link_t *audio_data_link_clone(audio_data_t *adata) 57 audio_data_t *audio_data_create(const void *data, size_t size, 58 pcm_format_t format) 59 { 60 audio_data_t *adata = malloc(sizeof(audio_data_t)); 61 if (adata) { 62 adata->data = data; 63 adata->size = size; 64 adata->format = format; 65 atomic_set(&adata->refcount, 1); 66 } 67 return adata; 68 } 69 70 void audio_data_unref(audio_data_t *adata) 71 { 72 ref_dec(adata); 73 } 74 75 audio_data_link_t *audio_data_link_create(audio_data_t *adata) 58 76 { 59 77 assert(adata); … … 67 85 } 68 86 69 audio_data_link_t * audio_data_link_create(const void *data, size_t size) 87 audio_data_link_t * audio_data_link_create_data(const void *data, size_t size, 88 pcm_format_t format) 70 89 { 71 90 audio_data_link_t *link = NULL; 72 audio_data_t *adata = malloc(sizeof(audio_data_t));91 audio_data_t *adata = audio_data_create(data, size, format); 73 92 if (adata) { 74 adata->data = data; 75 adata->size = size; 76 atomic_set(&adata->refcount, 1); 77 link = audio_data_link_clone(adata); 93 link = audio_data_link_create(adata); 78 94 /* This will either return refcount to 1 or clean adata if 79 95 * cloning failed */ 80 ref_dec(adata);96 audio_data_unref(adata); 81 97 } 82 98 return link; … … 91 107 } 92 108 109 size_t audio_data_link_available_frames(audio_data_link_t *alink) 110 { 111 assert(alink); 112 assert(alink->adata); 113 return pcm_format_size_to_frames(alink->adata->size - alink->position, 114 &alink->adata->format); 115 } 116 93 117 /** 94 118 * @} -
uspace/srv/audio/hound/audio_data.h
r5a6f362 r5029c788 37 37 #define AUDIO_DATA_H_ 38 38 39 #include <pcm/format.h> 39 40 #include <adt/list.h> 40 41 #include <atomic.h> … … 43 44 const void *data; 44 45 size_t size; 46 pcm_format_t format; 45 47 atomic_t refcount; 46 48 } audio_data_t; … … 57 59 } 58 60 59 audio_data_link_t * audio_data_link_create(const void *data, size_t size); 60 audio_data_link_t *audio_data_link_clone(audio_data_t *adata); 61 audio_data_t * audio_data_create(const void *data, size_t size, 62 pcm_format_t format); 63 void audio_data_unref(audio_data_t *adata); 64 65 audio_data_link_t * audio_data_link_create_data(const void *data, size_t size, 66 pcm_format_t format); 67 audio_data_link_t *audio_data_link_create(audio_data_t *adata); 61 68 void audio_data_link_destroy(audio_data_link_t *link); 62 69 70 size_t audio_data_link_available_frames(audio_data_link_t *alink); 71 static inline const void * audio_data_link_start(audio_data_link_t *alink) 72 { 73 assert(alink); 74 assert(alink->adata); 75 return alink->adata->data + alink->position; 76 } 77 78 static inline size_t audio_data_link_remain_size(audio_data_link_t *alink) 79 { 80 assert(alink); 81 assert(alink->adata); 82 assert(alink->position <= alink->adata->size); 83 return alink->adata->size - alink->position; 84 } 63 85 #endif 64 86 -
uspace/srv/audio/hound/connection.c
r5a6f362 r5029c788 46 46 connection_t *conn = malloc(sizeof(connection_t)); 47 47 if (conn) { 48 list_initialize(&conn->fifo); 48 49 link_initialize(&conn->source_link); 49 50 link_initialize(&conn->sink_link); … … 73 74 if (connection->source && connection->source->connection_change) 74 75 connection->source->connection_change(connection->source, false); 76 while (!list_empty(&connection->fifo)) { 77 link_t *l = list_first(&connection->fifo); 78 audio_data_link_t *data = audio_data_link_list_instance(l); 79 list_remove(&data->link); 80 audio_data_link_destroy(data); 81 } 75 82 log_debug("DISCONNECTED: %s -> %s", 76 83 connection->source->name, connection->sink->name); … … 87 94 } 88 95 89 int connection_ new_data(connection_t *connection, const void *data, size_t size)96 int connection_push_data(connection_t *connection, audio_data_t *adata) 90 97 { 91 98 assert(connection); 92 return ENOTSUP; 99 assert(adata); 100 audio_data_link_t *alink = audio_data_link_create(adata); 101 if (!alink) { 102 log_warning("Failed to buffer %zu bytes of data.", adata->size); 103 return ENOMEM; 104 } 105 log_fatal("Pushed new data to connection fifo"); 106 list_append(&alink->link, &connection->fifo); 107 return EOK; 93 108 } 94 109 -
uspace/srv/audio/hound/connection.h
r5a6f362 r5029c788 41 41 #include <pcm/format.h> 42 42 43 #include "audio_data.h" 43 44 #include "audio_source.h" 44 45 #include "audio_sink.h" … … 48 49 link_t sink_link; 49 50 link_t hound_link; 51 list_t fifo; 50 52 audio_sink_t *sink; 51 53 audio_source_t *source; … … 73 75 size_t size, pcm_format_t format); 74 76 75 int connection_ new_data(connection_t *connection, const void *data, size_t size);77 int connection_push_data(connection_t *connection, audio_data_t *adata); 76 78 77 79 static inline const char *connection_source_name(connection_t *connection) -
uspace/srv/audio/hound/hound_ctx.c
r5a6f362 r5029c788 36 36 37 37 #include <malloc.h> 38 #include <macros.h> 38 39 39 40 #include "hound_ctx.h" … … 172 173 return EBUSY; 173 174 174 audio_data_link_t *adatalink = audio_data_link_create(data, size); 175 audio_data_link_t *adatalink = 176 audio_data_link_create_data(data, size, stream->format); 175 177 if (adatalink) { 176 178 list_append(&adatalink->link, &stream->fifo); … … 188 190 } 189 191 192 int hound_ctx_stream_add_self(hound_ctx_stream_t *stream, void *data, 193 size_t size, const pcm_format_t *f) 194 { 195 assert(stream); 196 const size_t src_frame_size = pcm_format_frame_size(&stream->format); 197 const size_t dst_frame_size = pcm_format_frame_size(f); 198 //TODO consider sample rate 199 size_t needed_frames = size / dst_frame_size; 200 while (needed_frames > 0 && !list_empty(&stream->fifo)) { 201 link_t *l = list_first(&stream->fifo); 202 audio_data_link_t *alink = audio_data_link_list_instance(l); 203 /* Get actual audio data chunk */ 204 const size_t available_frames = 205 audio_data_link_available_frames(alink); 206 const size_t copy_frames = min(available_frames, needed_frames); 207 const size_t copy_size = copy_frames * dst_frame_size; 208 209 /* Copy audio data */ 210 pcm_format_convert_and_mix(data, copy_size, 211 audio_data_link_start(alink), 212 audio_data_link_remain_size(alink), 213 &alink->adata->format, f); 214 215 /* Update values */ 216 needed_frames -= copy_frames; 217 data += copy_size; 218 alink->position += (copy_frames * src_frame_size); 219 if (audio_data_link_remain_size(alink) == 0) { 220 list_remove(&alink->link); 221 audio_data_link_destroy(alink); 222 } else { 223 assert(needed_frames == 0); 224 } 225 } 226 return ENOTSUP; 227 } 228 190 229 void hound_ctx_stream_drain(hound_ctx_stream_t *stream) 191 230 { -
uspace/srv/audio/hound/hound_ctx.h
r5a6f362 r5029c788 71 71 size_t size); 72 72 int hound_ctx_stream_read(hound_ctx_stream_t *stream, void *buffer, size_t size); 73 int hound_ctx_stream_add_self(hound_ctx_stream_t *stream, void *data, 74 size_t size, const pcm_format_t *f); 73 75 void hound_ctx_stream_drain(hound_ctx_stream_t *stream); 74 76 int hound_ctx_stream_add(hound_ctx_stream_t *stream, void *buffer, size_t size,
Note:
See TracChangeset
for help on using the changeset viewer.