Changeset 4eff63c in mainline


Ignore:
Timestamp:
2013-04-11T21:55:43Z (11 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
6eeaf1d
Parents:
bee5349
Message:

hound: implement device source events

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

Legend:

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

    rbee5349 r4eff63c  
    5555static int get_buffer(audio_device_t *dev);
    5656static int release_buffer(audio_device_t *dev);
    57 static void fill_buffer(audio_device_t *dev, size_t size);
     57static void advance_buffer(audio_device_t *dev, size_t size);
    5858static inline bool is_running(audio_device_t *dev)
    5959{
     
    167167                pcm_format_silence(dev->buffer.base, dev->buffer.size,
    168168                    &dev->sink.format);
    169                 fill_buffer(dev, dev->buffer.fragment_size * 2);
     169                //TODO add underrun detection.
     170                const size_t size = dev->buffer.fragment_size * 2;
     171                /* We never cross the end of the buffer here */
     172                audio_sink_mix_inputs(&dev->sink, dev->buffer.position, size);
     173                advance_buffer(dev, size);
    170174
    171175                const unsigned frames = dev->buffer.fragment_size /
     
    280284                        struct timeval time1;
    281285                        getuptime(&time1);
    282                         fill_buffer(dev, dev->buffer.fragment_size);
     286                        //TODO add underrun detection.
     287                        /* We never cross the end of the buffer here */
     288                        audio_sink_mix_inputs(&dev->sink, dev->buffer.position,
     289                            dev->buffer.fragment_size);
     290                        advance_buffer(dev, dev->buffer.fragment_size);
    283291                        struct timeval time2;
    284292                        getuptime(&time2);
     
    290298                        log_verbose("Playback terminated!");
    291299                        return;
    292                 case PCM_EVENT_FRAMES_CAPTURED:
    293                         //TODO implement
     300                case PCM_EVENT_FRAMES_CAPTURED: {
     301                        const int ret = audio_source_push_data(&dev->source,
     302                            dev->buffer.position, dev->buffer.fragment_size);
     303                        advance_buffer(dev, dev->buffer.fragment_size);
     304                        if (ret != EOK)
     305                                log_warning("Failed to push recorded data");
    294306                        break;
     307                }
    295308                case PCM_EVENT_CAPTURE_TERMINATED:
    296309                        log_verbose("Recording terminated!");
     
    372385
    373386/**
    374  * Mix data from all connections and add it to the device buffer.
     387 * Move buffer position pointer.
    375388 * @param dev Audio device.
    376  * @param size portion of the device buffer to fill.
    377  */
    378 static void fill_buffer(audio_device_t *dev, size_t size)
     389 * @param size number of bytes to move forward
     390 */
     391static void advance_buffer(audio_device_t *dev, size_t size)
    379392{
    380393        assert(dev);
    381394        assert(dev->buffer.position >= dev->buffer.base);
    382395        assert(dev->buffer.position < (dev->buffer.base + dev->buffer.size));
    383 
    384         //TODO add underrun detection.
    385         audio_sink_mix_inputs(&dev->sink, dev->buffer.position, size);
    386396        dev->buffer.position += size;
    387397        if (dev->buffer.position == (dev->buffer.base + dev->buffer.size))
  • uspace/srv/audio/hound/audio_source.c

    rbee5349 r4eff63c  
    4141#include <str_error.h>
    4242
     43#include "audio_data.h"
    4344#include "audio_source.h"
    4445#include "audio_sink.h"
     46#include "connection.h"
    4547#include "log.h"
    4648
     
    8789        source->name = NULL;
    8890}
     91/**
     92 * Push data to all connections.
     93 * @param source The source of the data.
     94 * @param dest Destination buffer.
     95 * @param size size of the @p dest buffer.
     96 * @return Error code.
     97 */
     98int audio_source_push_data(audio_source_t *source, const void *data,
     99    size_t size)
     100{
     101        assert(source);
     102        assert(data);
     103
     104        audio_data_t *adata = audio_data_create(data, size, source->format);
     105        if (!adata)
     106                return ENOMEM;
     107
     108        list_foreach(source->connections, it) {
     109                connection_t *conn = connection_from_source_list(it);
     110                const int ret = connection_push_data(conn, adata);
     111                if (ret != EOK) {
     112                        log_warning("Failed push data to %s: %s",
     113                            connection_sink_name(conn), str_error(ret));
     114                }
     115        }
     116        audio_data_unref(adata);
     117        return EOK;
     118}
    89119
    90120/**
  • uspace/srv/audio/hound/audio_source.h

    rbee5349 r4eff63c  
    7575    const pcm_format_t *f);
    7676void audio_source_fini(audio_source_t *source);
     77int audio_source_push_data(audio_source_t *source, const void *data,
     78    size_t size);
    7779static inline const pcm_format_t *audio_source_format(const audio_source_t *s)
    7880{
Note: See TracChangeset for help on using the changeset viewer.