Ignore:
Timestamp:
2013-04-11T21:55:43Z (12 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

File:
1 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))
Note: See TracChangeset for help on using the changeset viewer.