Changeset 1ba95ba in mainline


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.

Location:
uspace/drv/audio/sb16
Files:
3 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
  • uspace/drv/audio/sb16/dsp.h

    rfa91c0f r1ba95ba  
    7575void sb_dsp_interrupt(sb_dsp_t *dsp);
    7676unsigned sb_dsp_query_cap(sb_dsp_t *dsp, audio_cap_t cap);
     77int sb_dsp_get_buffer_position(sb_dsp_t *dsp, size_t *size);
    7778int sb_dsp_test_format(sb_dsp_t *dsp, unsigned *channels, unsigned *rate,
    7879  pcm_sample_format_t *format);
  • uspace/drv/audio/sb16/pcm_iface.c

    rfa91c0f r1ba95ba  
    7070        return sb_dsp_get_buffer(dsp, buffer, size);
    7171}
     72
     73static int sb_get_buffer_position(ddf_fun_t *fun, size_t *size)
     74{
     75        assert(fun);
     76        assert(fun->driver_data);
     77        sb_dsp_t *dsp = fun->driver_data;
     78        return sb_dsp_get_buffer_position(dsp, size);
     79}
     80
    7281static int sb_set_event_session(ddf_fun_t *fun, async_sess_t *sess)
    7382{
     
    130139        .release_buffer = sb_release_buffer,
    131140        .set_event_session = sb_set_event_session,
     141        .get_buffer_pos = sb_get_buffer_position,
    132142
    133143        .start_playback = sb_start_playback,
Note: See TracChangeset for help on using the changeset viewer.