Changeset 1ba95ba in mainline for uspace/drv/audio/sb16/dsp.c


Ignore:
Timestamp:
2012-08-19T16:10:48Z (12 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
86fe9d1
Parents:
fa91c0f
Message:

sb16: Implement and enable buffer position capability.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/audio/sb16/dsp.c

    rfa91c0f r1ba95ba  
    250250unsigned sb_dsp_query_cap(sb_dsp_t *dsp, audio_cap_t cap)
    251251{
     252        ddf_log_verbose("Querying cap %u", cap);
    252253        switch(cap) {
    253254        case AUDIO_CAP_CAPTURE:
    254255        case AUDIO_CAP_PLAYBACK:
    255256        case AUDIO_CAP_INTERRUPT:
     257        case AUDIO_CAP_BUFFER_POS:
    256258                return 1;
    257259        case AUDIO_CAP_MAX_BUFFER:
     
    261263        case AUDIO_CAP_INTERRUPT_MAX_FRAMES:
    262264                return 16535;
    263         case AUDIO_CAP_BUFFER_POS:
    264265        default:
    265266                return 0;
    266267        }
     268}
     269
     270int sb_dsp_get_buffer_position(sb_dsp_t *dsp, size_t *pos)
     271{
     272        if (!dsp->buffer.data)
     273                return ENOENT;
     274
     275        async_sess_t *sess = devman_parent_device_connect(EXCHANGE_ATOMIC,
     276            dsp->sb_dev->handle, IPC_FLAG_BLOCKING);
     277
     278        // TODO: Assumes DMA 16
     279        const int remain = hw_res_dma_channel_remain(sess, dsp->dma16_channel);
     280        async_hangup(sess);
     281        if (remain >= 0) {
     282                *pos = dsp->buffer.size - remain;
     283                return EOK;
     284        }
     285        return remain;
    267286}
    268287
Note: See TracChangeset for help on using the changeset viewer.