Changeset 5029c788 in mainline


Ignore:
Timestamp:
2013-04-04T16:21:41Z (11 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9e40d443
Parents:
5a6f362
Message:

hound: add connection fifo, implement stream mixing

Location:
uspace/srv/audio/hound
Files:
6 edited

Legend:

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

    r5a6f362 r5029c788  
    5555}
    5656
    57 audio_data_link_t *audio_data_link_clone(audio_data_t *adata)
     57audio_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
     70void audio_data_unref(audio_data_t *adata)
     71{
     72        ref_dec(adata);
     73}
     74
     75audio_data_link_t *audio_data_link_create(audio_data_t *adata)
    5876{
    5977        assert(adata);
     
    6785}
    6886
    69 audio_data_link_t * audio_data_link_create(const void *data, size_t size)
     87audio_data_link_t * audio_data_link_create_data(const void *data, size_t size,
     88    pcm_format_t format)
    7089{
    7190        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);
    7392        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);
    7894                /* This will either return refcount to 1 or clean adata if
    7995                 * cloning failed */
    80                 ref_dec(adata);
     96                audio_data_unref(adata);
    8197        }
    8298        return link;
     
    91107}
    92108
     109size_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
    93117/**
    94118 * @}
  • uspace/srv/audio/hound/audio_data.h

    r5a6f362 r5029c788  
    3737#define AUDIO_DATA_H_
    3838
     39#include <pcm/format.h>
    3940#include <adt/list.h>
    4041#include <atomic.h>
     
    4344        const void *data;
    4445        size_t size;
     46        pcm_format_t format;
    4547        atomic_t refcount;
    4648} audio_data_t;
     
    5759}
    5860
    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);
     61audio_data_t * audio_data_create(const void *data, size_t size,
     62    pcm_format_t format);
     63void audio_data_unref(audio_data_t *adata);
     64
     65audio_data_link_t * audio_data_link_create_data(const void *data, size_t size,
     66    pcm_format_t format);
     67audio_data_link_t *audio_data_link_create(audio_data_t *adata);
    6168void audio_data_link_destroy(audio_data_link_t *link);
    6269
     70size_t audio_data_link_available_frames(audio_data_link_t *alink);
     71static 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
     78static 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}
    6385#endif
    6486
  • uspace/srv/audio/hound/connection.c

    r5a6f362 r5029c788  
    4646        connection_t *conn = malloc(sizeof(connection_t));
    4747        if (conn) {
     48                list_initialize(&conn->fifo);
    4849                link_initialize(&conn->source_link);
    4950                link_initialize(&conn->sink_link);
     
    7374        if (connection->source && connection->source->connection_change)
    7475                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        }
    7582        log_debug("DISCONNECTED: %s -> %s",
    7683            connection->source->name, connection->sink->name);
     
    8794}
    8895
    89 int connection_new_data(connection_t *connection, const void *data, size_t size)
     96int connection_push_data(connection_t *connection, audio_data_t *adata)
    9097{
    9198        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;
    93108}
    94109
  • uspace/srv/audio/hound/connection.h

    r5a6f362 r5029c788  
    4141#include <pcm/format.h>
    4242
     43#include "audio_data.h"
    4344#include "audio_source.h"
    4445#include "audio_sink.h"
     
    4849        link_t sink_link;
    4950        link_t hound_link;
     51        list_t fifo;
    5052        audio_sink_t *sink;
    5153        audio_source_t *source;
     
    7375    size_t size, pcm_format_t format);
    7476
    75 int connection_new_data(connection_t *connection, const void *data, size_t size);
     77int connection_push_data(connection_t *connection, audio_data_t *adata);
    7678
    7779static inline const char *connection_source_name(connection_t *connection)
  • uspace/srv/audio/hound/hound_ctx.c

    r5a6f362 r5029c788  
    3636
    3737#include <malloc.h>
     38#include <macros.h>
    3839
    3940#include "hound_ctx.h"
     
    172173                return EBUSY;
    173174
    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);
    175177        if (adatalink) {
    176178                list_append(&adatalink->link, &stream->fifo);
     
    188190}
    189191
     192int 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
    190229void hound_ctx_stream_drain(hound_ctx_stream_t *stream)
    191230{
  • uspace/srv/audio/hound/hound_ctx.h

    r5a6f362 r5029c788  
    7171    size_t size);
    7272int hound_ctx_stream_read(hound_ctx_stream_t *stream, void *buffer, size_t size);
     73int hound_ctx_stream_add_self(hound_ctx_stream_t *stream, void *data,
     74    size_t size, const pcm_format_t *f);
    7375void hound_ctx_stream_drain(hound_ctx_stream_t *stream);
    7476int hound_ctx_stream_add(hound_ctx_stream_t *stream, void *buffer, size_t size,
Note: See TracChangeset for help on using the changeset viewer.