Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset bf13c9a4 in mainline


Ignore:
Timestamp:
2013-04-04T12:16:46Z (9 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master
Children:
23878dc
Parents:
b266f9e
Message:

hound: add stream fifo

Location:
uspace/srv/audio/hound
Files:
3 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 * @}
  • uspace/srv/audio/hound/hound_ctx.h

    rb266f9e rbf13c9a4  
    5656typedef struct {
    5757        link_t link;
     58        list_t fifo;
    5859        hound_ctx_t *ctx;
    5960        pcm_format_t format;
    6061        int flags;
    6162        size_t allowed_size;
     63        size_t current_size;
    6264} hound_ctx_stream_t;
    6365
     
    7981void hound_ctx_destroy_stream(hound_ctx_stream_t *stream);
    8082
     83int hound_ctx_stream_write(hound_ctx_stream_t *stream, const void *buffer,
     84    size_t size);
     85int hound_ctx_stream_read(hound_ctx_stream_t *stream, void *buffer, size_t size);
     86
    8187#endif
    8288
  • uspace/srv/audio/hound/iface.c

    rb266f9e rbf13c9a4  
    131131static int iface_rem_stream(void *server, void *stream)
    132132{
    133         log_verbose("%s: %p, %s", __FUNCTION__, server, (char *)stream);
    134133        hound_ctx_destroy_stream(stream);
    135134        return EOK;
     
    138137static int iface_stream_data_read(void *stream, void *buffer, size_t size)
    139138{
    140         log_verbose("%p:, %zu", stream, size);
    141         return ENOTSUP;
     139        return hound_ctx_stream_read(stream, buffer, size);
    142140}
    143141
    144142static int iface_stream_data_write(void *stream, const void *buffer, size_t size)
    145143{
    146         log_verbose("%p: %zu", stream, size);
    147         return ENOTSUP;
     144        return hound_ctx_stream_write(stream, buffer, size);
    148145}
    149146
Note: See TracChangeset for help on using the changeset viewer.