Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 6747b929 in mainline


Ignore:
Timestamp:
2014-08-26T11:35:23Z (6 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
c67195c
Parents:
159c722d
Message:

Playback stopping and restart.

Location:
uspace/drv/audio/hdaudio
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/audio/hdaudio/pcm_iface.c

    r159c722d r6747b929  
    228228static int hda_stop_playback(ddf_fun_t *fun, bool immediate)
    229229{
     230        hda_t *hda = fun_to_hda(fun);
     231
    230232        ddf_msg(LVL_NOTE, "hda_stop_playback()");
    231         return ENOTSUP;
     233        hda_stream_stop(hda->pcm_stream);
     234        hda_stream_reset(hda->pcm_stream);
     235
     236        hda_pcm_event(hda, PCM_EVENT_PLAYBACK_TERMINATED);
     237        return EOK;
    232238}
    233239
  • uspace/drv/audio/hdaudio/spec/regs.h

    r159c722d r6747b929  
    166166
    167167typedef enum {
     168        /** Descriptor Error Interrupt Enable */
     169        sdctl1_deie = 4,
     170        /** FIFO Error Interrupt Enable */
     171        sdctl1_feie = 3,
     172        /** Interrupt on Completion Enable */
     173        sdctl1_ioce = 2,
     174        /** Stream Run */
     175        sdctl1_run = 1,
     176        /** Stream Reset */
     177        sdctl1_srst = 0
     178} hda_sdesc_ctl1_bits;
     179
     180typedef enum {
    168181        /** Number of Output Streams Supported (H) */
    169182        gcap_oss_h = 15,
  • uspace/drv/audio/hdaudio/stream.c

    r159c722d r6747b929  
    177177
    178178        ctl = hda_reg8_read(&sdregs->ctl1);
    179         ctl = ctl | 2 /* XXX Run */;
     179        if (run)
     180                ctl = ctl | BIT_V(uint8_t, sdctl1_run);
     181        else
     182                ctl = ctl & ~BIT_V(uint8_t, sdctl1_run);
     183
    180184        hda_reg8_write(&sdregs->ctl1, ctl);
     185}
     186
     187static void hda_stream_reset_noinit(hda_stream_t *stream)
     188{
     189        uint32_t ctl;
     190        hda_sdesc_regs_t *sdregs;
     191
     192        sdregs = &stream->hda->regs->sdesc[stream->sdid];
     193
     194        ctl = hda_reg8_read(&sdregs->ctl1);
     195        ctl = ctl | BIT_V(uint8_t, sdctl1_srst);
     196        hda_reg8_write(&sdregs->ctl1, ctl);
     197
     198        async_usleep(100 * 1000);
     199
     200//      ctl = hda_reg8_read(&sdregs->ctl1);
     201//      ctl = ctl & ~BIT_V(uint8_t, sdctl1_srst);
     202//      hda_reg8_write(&sdregs->ctl1, ctl);
     203
     204//      async_usleep(100 * 1000);
    181205}
    182206
     
    214238{
    215239        ddf_msg(LVL_NOTE, "hda_stream_destroy()");
     240        hda_stream_reset_noinit(stream);
    216241        free(stream);
    217242}
     
    223248}
    224249
     250void hda_stream_stop(hda_stream_t *stream)
     251{
     252        ddf_msg(LVL_NOTE, "hda_stream_stop()");
     253        hda_stream_set_run(stream, false);
     254}
     255
     256void hda_stream_reset(hda_stream_t *stream)
     257{
     258        ddf_msg(LVL_NOTE, "hda_stream_reset()");
     259        hda_stream_reset_noinit(stream);
     260        hda_stream_desc_configure(stream);
     261}
     262
    225263/** @}
    226264 */
  • uspace/drv/audio/hdaudio/stream.h

    r159c722d r6747b929  
    7373
    7474extern hda_stream_t *hda_stream_create(hda_t *, hda_stream_dir_t, uint32_t);
     75extern void hda_stream_destroy(hda_stream_t *);
    7576extern void hda_stream_start(hda_stream_t *);
    76 extern void hda_stream_destroy(hda_stream_t *);
     77extern void hda_stream_stop(hda_stream_t *);
     78extern void hda_stream_reset(hda_stream_t *);
    7779
    7880#endif
Note: See TracChangeset for help on using the changeset viewer.