Changeset bf13c9a4 in mainline for uspace/srv/audio/hound/hound_ctx.c


Ignore:
Timestamp:
2013-04-04T12:16:46Z (11 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
23878dc
Parents:
b266f9e
Message:

hound: add stream fifo

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/audio/hound/hound_ctx.c

    rb266f9e rbf13c9a4  
    9494}
    9595
     96/*
     97 * STREAMS
     98 */
     99
     100typedef struct {
     101        const void *data;
     102        size_t size;
     103        link_t link;
     104} audio_data_t;
     105
     106static inline audio_data_t * audio_data_list_instance(link_t *l)
     107{
     108        return l ? list_get_instance(l, audio_data_t, link) : NULL;
     109}
     110
    96111hound_ctx_stream_t *hound_ctx_create_stream(hound_ctx_t *ctx, int flags,
    97112        pcm_format_t format, size_t buffer_size)
     
    100115        hound_ctx_stream_t *stream = malloc(sizeof(hound_ctx_stream_t));
    101116        if (stream) {
     117                list_initialize(&stream->fifo);
    102118                link_initialize(&stream->link);
    103119                stream->ctx = ctx;
     
    105121                stream->format = format;
    106122                stream->allowed_size = buffer_size;
     123                stream->current_size = 0;
    107124                list_append(&stream->link, &ctx->streams);
    108125                log_verbose("CTX: %p added stream; flags:%#x ch: %u r:%u f:%s",
     
    116133{
    117134        if (stream) {
     135                //TODO consider DRAIN FLAG
    118136                list_remove(&stream->link);
    119                 //TODO free used buffer space
    120                 log_verbose("CTX: %p remove stream; flags:%#x ch: %u r:%u f:%s",
    121                     stream->ctx, stream->flags, stream->format.channels,
     137                if (!list_empty(&stream->fifo))
     138                        log_warning("Destroying stream with non empty buffer");
     139                while (!list_empty(&stream->fifo)) {
     140                        link_t *l = list_first(&stream->fifo);
     141                        audio_data_t *data = audio_data_list_instance(l);
     142                        list_remove(l);
     143                        free(data->data);
     144                        free(data);
     145                }
     146                log_verbose("CTX: %p remove stream (%zu/%zu); "
     147                    "flags:%#x ch: %u r:%u f:%s",
     148                    stream->ctx, stream->current_size, stream->allowed_size,
     149                    stream->flags, stream->format.channels,
    122150                    stream->format.sampling_rate,
    123151                    pcm_sample_format_str(stream->format.sample_format));
     
    126154}
    127155
     156
     157int hound_ctx_stream_write(hound_ctx_stream_t *stream, const void *data,
     158    size_t size)
     159{
     160        assert(stream);
     161        log_verbose("%p:, %zu", stream, size);
     162
     163        if (stream->allowed_size && size > stream->allowed_size)
     164                return EINVAL;
     165
     166        if (stream->allowed_size &&
     167            (stream->current_size + size > stream->allowed_size))
     168                return EBUSY;
     169
     170        audio_data_t *adata = malloc(sizeof(audio_data_t));
     171        if (adata) {
     172                adata->data = data;
     173                adata->size = size;
     174                link_initialize(&adata->link);
     175                list_append(&adata->link, &stream->fifo);
     176                stream->current_size += size;
     177                return EOK;
     178        }
     179        log_warning("Failed to enqueue %zu bytes of data.", size);
     180        return ENOMEM;
     181}
     182
     183int hound_ctx_stream_read(hound_ctx_stream_t *stream, void *data, size_t size)
     184{
     185        log_verbose("%p:, %zu", stream, size);
     186        return ENOTSUP;
     187}
     188
    128189/**
    129190 * @}
Note: See TracChangeset for help on using the changeset viewer.