Changeset 159c722d in mainline


Ignore:
Timestamp:
2014-08-26T10:10:50Z (10 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
6747b929
Parents:
99cb9bf
Message:

Garbled playback via hound.

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

Legend:

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

    r99cb9bf r159c722d  
    279279        uint32_t fmt;
    280280        /* 48 kHz, 16-bits, 1 channel */
    281         fmt = fmt_bits_16 << fmt_bits_l;
     281        fmt = (fmt_base_44khz << fmt_base) | (fmt_bits_16 << fmt_bits_l);
    282282
    283283        /* Configure converter */
  • uspace/drv/audio/hdaudio/hdaudio.c

    r99cb9bf r159c722d  
    354354        if (0) ddf_msg(LVL_NOTE, "## interrupt ##");
    355355//      ddf_msg(LVL_NOTE, "interrupt arg4=0x%x", (int)IPC_GET_ARG4(*icall));
     356        if (IPC_GET_ARG3(*icall) != 0) {
     357                hda_pcm_event(hda, PCM_EVENT_FRAMES_PLAYED);
     358                hda_pcm_event(hda, PCM_EVENT_FRAMES_PLAYED);
     359                hda_pcm_event(hda, PCM_EVENT_FRAMES_PLAYED);
     360                hda_pcm_event(hda, PCM_EVENT_FRAMES_PLAYED);
     361/*              hda_pcm_event(hda, PCM_EVENT_FRAMES_PLAYED);
     362                hda_pcm_event(hda, PCM_EVENT_FRAMES_PLAYED);
     363                hda_pcm_event(hda, PCM_EVENT_FRAMES_PLAYED);
     364                hda_pcm_event(hda, PCM_EVENT_FRAMES_PLAYED);*/
     365        }
    356366        hda_ctl_interrupt(hda->ctl);
    357367}
  • uspace/drv/audio/hdaudio/hdaudio.h

    r99cb9bf r159c722d  
    4545typedef struct hda {
    4646        async_sess_t *parent_sess;
     47        async_sess_t *ev_sess;
    4748        ddf_fun_t *fun_pcm;
    4849        uint64_t rwbase;
  • uspace/drv/audio/hdaudio/pcm_iface.c

    r99cb9bf r159c722d  
    4343#include "hdactl.h"
    4444#include "hdaudio.h"
     45#include "pcm_iface.h"
    4546#include "spec/fmt.h"
    4647#include "stream.h"
     
    155156        uint32_t fmt;
    156157        /* 48 kHz, 16-bits, 1 channel */
    157         fmt = fmt_bits_16 << fmt_bits_l;
     158        fmt = (fmt_base_44khz << fmt_base) | (fmt_bits_16 << fmt_bits_l);
    158159
    159160        ddf_msg(LVL_NOTE, "hda_get_buffer() - create stream");
     
    165166        /* XXX This is only one buffer */
    166167        *buffer = hda->pcm_stream->buf[0];
    167         *size = hda->pcm_stream->bufsize;
     168        *size = hda->pcm_stream->bufsize * hda->pcm_stream->nbuffers;
    168169
    169170        ddf_msg(LVL_NOTE, "hda_get_buffer() retturing EOK, buffer=%p, size=%zu",
     
    180181static int hda_set_event_session(ddf_fun_t *fun, async_sess_t *sess)
    181182{
     183        hda_t *hda = fun_to_hda(fun);
     184
    182185        ddf_msg(LVL_NOTE, "hda_set_event_session()");
    183         return ENOTSUP;
     186        hda->ev_sess = sess;
     187        return EOK;
    184188}
    185189
    186190static async_sess_t *hda_get_event_session(ddf_fun_t *fun)
    187191{
     192        hda_t *hda = fun_to_hda(fun);
     193
    188194        ddf_msg(LVL_NOTE, "hda_get_event_session()");
    189         return NULL;
     195        return hda->ev_sess;
    190196}
    191197
     
    215221                return rc;
    216222
     223        async_usleep(1000*1000);
    217224        hda_stream_start(hda->pcm_stream);
    218225        return EOK;
     
    238245}
    239246
     247void hda_pcm_event(hda_t *hda, pcm_event_t event)
     248{
     249        async_exch_t *exchange;
     250
     251        if (hda->ev_sess == NULL) {
     252                ddf_log_warning("No one listening for event %u", event);
     253                return;
     254        }
     255
     256        exchange = async_exchange_begin(hda->ev_sess);
     257        async_msg_1(exchange, event, 0);
     258        async_exchange_end(exchange);
     259}
     260
    240261/** @}
    241262 */
  • uspace/drv/audio/hdaudio/pcm_iface.h

    r99cb9bf r159c722d  
    3838#include <audio_pcm_iface.h>
    3939
     40#include "hdaudio.h"
     41
    4042extern audio_pcm_iface_t hda_pcm_iface;
     43extern void hda_pcm_event(hda_t *, pcm_event_t);
    4144
    4245#endif
  • uspace/drv/audio/hdaudio/stream.c

    r99cb9bf r159c722d  
    5454        uintptr_t buffer_phys;
    5555        size_t i;
    56         size_t j, k;
     56//      size_t j, k;
    5757        int rc;
    5858
    59         stream->nbuffers = 2;
     59        stream->nbuffers = 4;
    6060        stream->bufsize = 16384;
    6161
     
    8484
    8585        /* Allocate buffers */
    86 
     86/*
    8787        for (i = 0; i < stream->nbuffers; i++) {
    8888                buffer = AS_AREA_ANY;
     
    108108                }
    109109        }
     110*/
     111//      async_usleep(1000*1000);
     112        /* audio_pcm_iface requires a single contiguous buffer */
     113        buffer = AS_AREA_ANY;
     114        rc = dmamem_map_anonymous(stream->bufsize * stream->nbuffers,
     115            stream->hda->ctl->ok64bit ? 0 : DMAMEM_4GiB, AS_AREA_READ | AS_AREA_WRITE,
     116            0, &buffer_phys, &buffer);
     117        if (rc != EOK) {
     118                ddf_msg(LVL_NOTE, "dmamem_map_anon -> %d", rc);
     119                goto error;
     120        }
     121
     122        for (i = 0; i < stream->nbuffers; i++) {
     123                stream->buf[i] = buffer + i * stream->bufsize;
     124                stream->buf_phys[i] = buffer_phys + i * stream->bufsize;
     125
     126                ddf_msg(LVL_NOTE, "Stream buf phys=0x%llx virt=%p",
     127                    (long long unsigned)(uintptr_t)stream->buf[i],
     128                    (void *)stream->buf_phys[i]);
     129/*              k = 0;
     130                for (j = 0; j < stream->bufsize / 2; j++) {
     131                        int16_t *bp = stream->buf[i];
     132                        bp[j] = (k > 128) ? -10000 : 10000;
     133                        ++k;
     134                        if (k >= 256)
     135                                k = 0;
     136                }
     137*/
     138        }
    110139
    111140        /* Fill in BDL */
Note: See TracChangeset for help on using the changeset viewer.