Ignore:
Timestamp:
2012-07-15T15:14:10Z (12 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
57e8b3b
Parents:
b497018
Message:

Cleanup audio_pcm interface.

File:
1 edited

Legend:

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

    rb497018 r2cc5c835  
    4242#include <str_error.h>
    4343
    44 #include <audio_pcm_iface.h>
    4544
    4645#include "audio_device.h"
     
    5453static int get_buffer(audio_device_t *dev);
    5554static int release_buffer(audio_device_t *dev);
    56 static int start_playback(audio_device_t *dev);
    57 static int stop_playback(audio_device_t *dev);
    58 static int start_recording(audio_device_t *dev);
    59 static int stop_recording(audio_device_t *dev);
    6055
    6156
     
    6661        dev->id = id;
    6762        dev->name = str_dup(name);
    68         dev->sess = loc_service_connect(EXCHANGE_SERIALIZE, id, 0);
     63        dev->sess = audio_pcm_open_service(id);
    6964        if (!dev->sess) {
    7065                log_debug("Failed to connect to device \"%s\"", name);
     
    108103                }
    109104
    110                 ret = start_playback(dev);
     105                /* Fill the buffer first */
     106                audio_sink_mix_inputs(&dev->sink,
     107                    dev->buffer.base, dev->buffer.size);
     108
     109                ret = audio_pcm_start_playback(dev->sess, BUFFER_BLOCKS,
     110                    dev->sink.format.channels, dev->sink.format.sampling_rate,
     111                    dev->sink.format.sample_format);
    111112                if (ret != EOK) {
    112113                        log_error("Failed to start playback: %s",
     
    119120                assert(!new);
    120121                log_verbose("No connections on device sink '%s'", sink->name);
    121                 int ret = stop_playback(dev);
     122                int ret = audio_pcm_stop_playback(dev->sess);
    122123                if (ret != EOK) {
    123124                        log_error("Failed to start playback: %s",
     
    147148                        return ret;
    148149                }
    149                 ret = start_recording(dev);
     150                ret = audio_pcm_start_record(dev->sess, BUFFER_BLOCKS,
     151                    dev->sink.format.channels, dev->sink.format.sampling_rate,
     152                    dev->sink.format.sample_format);
    150153                if (ret != EOK) {
    151154                        log_error("Failed to start recording: %s",
     
    155158                }
    156159        } else { /* Disconnected */
    157                 int ret = stop_recording(dev);
     160                int ret = audio_pcm_stop_record(dev->sess);
    158161                if (ret != EOK) {
    159162                        log_error("Failed to start recording: %s",
     
    229232        dev->buffer.size = 0;
    230233
    231         async_exch_t *exch = async_exchange_begin(dev->sess);
    232         const int ret = audio_pcm_get_buffer(exch, &dev->buffer.base,
     234        return audio_pcm_get_buffer(dev->sess, &dev->buffer.base,
    233235            &dev->buffer.size, device_event_callback, dev);
    234         async_exchange_end(exch);
    235         return ret;
    236 }
    237 
    238 #define CHECK_BUFFER_AND_CONNECTION() \
    239 do { \
    240         assert(dev); \
    241         if (!dev->sess) { \
    242                 log_debug("No connection to device"); \
    243                 return EIO; \
    244         } \
    245         if (!dev->buffer.base) { \
    246                 log_debug("We don't have a buffer"); \
    247                 return ENOENT; \
    248         } \
    249 } while (0)
    250 
     236}
    251237
    252238static int release_buffer(audio_device_t *dev)
    253239{
    254         CHECK_BUFFER_AND_CONNECTION();
    255 
    256         async_exch_t *exch = async_exchange_begin(dev->sess);
    257         const int ret = audio_pcm_release_buffer(exch);
    258         async_exchange_end(exch);
     240        assert(dev);
     241        assert(dev->buffer.base);
     242
     243        const int ret = audio_pcm_release_buffer(dev->sess);
    259244        if (ret == EOK) {
    260245                dev->buffer.base = NULL;
    261246                dev->buffer.size = 0;
    262247                dev->buffer.position = NULL;
     248        } else {
     249                log_debug("Failed to release buffer: %s", str_error(ret));
    263250        }
    264251        return ret;
    265252}
    266 
    267 static int start_playback(audio_device_t *dev)
    268 {
    269         CHECK_BUFFER_AND_CONNECTION();
    270 
    271         /* Fill the buffer first */
    272         audio_sink_mix_inputs(&dev->sink, dev->buffer.base, dev->buffer.size);
    273 
    274         async_exch_t *exch = async_exchange_begin(dev->sess);
    275         const int ret = audio_pcm_start_playback(exch,
    276             BUFFER_BLOCKS, dev->sink.format.channels,
    277             dev->sink.format.sampling_rate, dev->sink.format.sample_format);
    278         async_exchange_end(exch);
    279         return ret;
    280 }
    281 
    282 static int stop_playback(audio_device_t *dev)
    283 {
    284         CHECK_BUFFER_AND_CONNECTION();
    285 
    286         async_exch_t *exch = async_exchange_begin(dev->sess);
    287         const int ret = audio_pcm_stop_playback(exch);
    288         async_exchange_end(exch);
    289         return ret;
    290 }
    291 
    292 static int start_recording(audio_device_t *dev)
    293 {
    294         CHECK_BUFFER_AND_CONNECTION();
    295 
    296         async_exch_t *exch = async_exchange_begin(dev->sess);
    297         const int ret = audio_pcm_start_record(exch,
    298             BUFFER_BLOCKS, dev->sink.format.channels,
    299             dev->sink.format.sampling_rate, dev->sink.format.sample_format);
    300         async_exchange_end(exch);
    301         return ret;
    302 }
    303 
    304 static int stop_recording(audio_device_t *dev)
    305 {
    306         CHECK_BUFFER_AND_CONNECTION();
    307 
    308         async_exch_t *exch = async_exchange_begin(dev->sess);
    309         const int ret = audio_pcm_stop_record(exch);
    310         async_exchange_end(exch);
    311         return ret;
    312 }
    313 
    314253/**
    315254 * @}
Note: See TracChangeset for help on using the changeset viewer.