Changeset 57a2208 in mainline


Ignore:
Timestamp:
2014-09-09T22:10:03Z (10 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
c4f67c8
Parents:
b14e9749
Message:

Hound should use the logging framework. Prevent hdaudio from sending frames played event after sending playback termination event. Remove unnecessary delays.

Location:
uspace
Files:
7 edited

Legend:

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

    rb14e9749 r57a2208  
    595595        }
    596596
    597         async_usleep(5*1000*1000);
    598597        ddf_msg(LVL_NOTE, "intsts=0x%x", hda_reg32_read(&hda->regs->intsts));
    599598        ddf_msg(LVL_NOTE, "sdesc[%d].sts=0x%x",
  • uspace/drv/audio/hdaudio/hdaudio.c

    rb14e9749 r57a2208  
    172172        }
    173173
     174        fibril_mutex_initialize(&hda->lock);
     175
    174176        ddf_msg(LVL_NOTE, "create parent sess");
    175177        hda->parent_sess = ddf_dev_parent_sess_create(dev,
     
    373375        if (0) ddf_msg(LVL_NOTE, "## interrupt ##");
    374376//      ddf_msg(LVL_NOTE, "interrupt arg4=0x%x", (int)IPC_GET_ARG4(*icall));
     377        hda_ctl_interrupt(hda->ctl);
     378
    375379        if (IPC_GET_ARG3(*icall) != 0) {
    376                 hda_pcm_event(hda, PCM_EVENT_FRAMES_PLAYED);
    377                 hda_pcm_event(hda, PCM_EVENT_FRAMES_PLAYED);
    378                 hda_pcm_event(hda, PCM_EVENT_FRAMES_PLAYED);
    379                 hda_pcm_event(hda, PCM_EVENT_FRAMES_PLAYED);
    380 /*              hda_pcm_event(hda, PCM_EVENT_FRAMES_PLAYED);
    381                 hda_pcm_event(hda, PCM_EVENT_FRAMES_PLAYED);
    382                 hda_pcm_event(hda, PCM_EVENT_FRAMES_PLAYED);
    383                 hda_pcm_event(hda, PCM_EVENT_FRAMES_PLAYED);*/
    384         }
    385         hda_ctl_interrupt(hda->ctl);
     380                /* Buffer completed */
     381                hda_lock(hda);
     382                if (hda->playing) {
     383                        hda_pcm_event(hda, PCM_EVENT_FRAMES_PLAYED);
     384                        hda_pcm_event(hda, PCM_EVENT_FRAMES_PLAYED);
     385                        hda_pcm_event(hda, PCM_EVENT_FRAMES_PLAYED);
     386                        hda_pcm_event(hda, PCM_EVENT_FRAMES_PLAYED);
     387                }
     388                hda_unlock(hda);
     389        }
     390}
     391
     392void hda_lock(hda_t *hda)
     393{
     394        fibril_mutex_lock(&hda->lock);
     395}
     396
     397void hda_unlock(hda_t *hda)
     398{
     399        fibril_mutex_unlock(&hda->lock);
    386400}
    387401
  • uspace/drv/audio/hdaudio/hdaudio.h

    rb14e9749 r57a2208  
    3838#include <async.h>
    3939#include <ddf/driver.h>
     40#include <fibril_synch.h>
     41#include <stdbool.h>
    4042#include <stdint.h>
    4143
     
    4446/** High Definition Audio driver instance */
    4547typedef struct hda {
     48        fibril_mutex_t lock;
    4649        async_sess_t *parent_sess;
    4750        async_sess_t *ev_sess;
     
    5255        struct hda_ctl *ctl;
    5356        struct hda_stream *pcm_stream;
     57        bool playing;
    5458} hda_t;
     59
     60extern void hda_lock(hda_t *);
     61extern void hda_unlock(hda_t *);
    5562
    5663#endif
  • uspace/drv/audio/hdaudio/pcm_iface.c

    rb14e9749 r57a2208  
    149149        hda_t *hda = fun_to_hda(fun);
    150150
     151        hda_lock(hda);
     152
    151153        ddf_msg(LVL_NOTE, "hda_get_buffer(): hda=%p", hda);
    152         if (hda->pcm_stream != NULL)
     154        if (hda->pcm_stream != NULL) {
     155                hda_unlock(hda);
    153156                return EBUSY;
     157        }
    154158
    155159        /* XXX Choose appropriate parameters */
     
    160164        ddf_msg(LVL_NOTE, "hda_get_buffer() - create stream");
    161165        hda->pcm_stream = hda_stream_create(hda, sdir_output, fmt);
    162         if (hda->pcm_stream == NULL)
     166        if (hda->pcm_stream == NULL) {
     167                hda_unlock(hda);
    163168                return EIO;
     169        }
    164170
    165171        ddf_msg(LVL_NOTE, "hda_get_buffer() - fill info");
     
    170176        ddf_msg(LVL_NOTE, "hda_get_buffer() retturing EOK, buffer=%p, size=%zu",
    171177            *buffer, *size);
     178
     179        hda_unlock(hda);
    172180        return EOK;
    173181}
     
    184192
    185193        ddf_msg(LVL_NOTE, "hda_set_event_session()");
     194        hda_lock(hda);
    186195        hda->ev_sess = sess;
     196        hda_unlock(hda);
     197
    187198        return EOK;
    188199}
     
    191202{
    192203        hda_t *hda = fun_to_hda(fun);
     204        async_sess_t *sess;
    193205
    194206        ddf_msg(LVL_NOTE, "hda_get_event_session()");
    195         return hda->ev_sess;
     207
     208        hda_lock(hda);
     209        sess = hda->ev_sess;
     210        hda_unlock(hda);
     211
     212        return sess;
    196213}
    197214
     
    200217        hda_t *hda = fun_to_hda(fun);
    201218
     219        hda_lock(hda);
     220
    202221        ddf_msg(LVL_NOTE, "hda_release_buffer()");
    203         if (hda->pcm_stream == NULL)
     222        if (hda->pcm_stream == NULL) {
     223                hda_unlock(hda);
    204224                return EINVAL;
     225        }
    205226
    206227        hda_stream_destroy(hda->pcm_stream);
    207228        hda->pcm_stream = NULL;
     229
     230        hda_unlock(hda);
    208231        return EOK;
    209232}
     
    216239
    217240        ddf_msg(LVL_NOTE, "hda_start_playback()");
     241        hda_lock(hda);
    218242
    219243        rc = hda_out_converter_setup(hda->ctl->codec, hda->pcm_stream);
    220         if (rc != EOK)
     244        if (rc != EOK) {
     245                hda_unlock(hda);
    221246                return rc;
    222 
    223         async_usleep(1000*1000);
     247        }
     248
    224249        hda_stream_start(hda->pcm_stream);
     250        hda->playing = true;
     251        hda_unlock(hda);
    225252        return EOK;
    226253}
     
    231258
    232259        ddf_msg(LVL_NOTE, "hda_stop_playback()");
     260        hda_lock(hda);
    233261        hda_stream_stop(hda->pcm_stream);
    234262        hda_stream_reset(hda->pcm_stream);
     263        hda->playing = false;
     264        hda_unlock(hda);
    235265
    236266        hda_pcm_event(hda, PCM_EVENT_PLAYBACK_TERMINATED);
  • uspace/drv/audio/hdaudio/stream.c

    rb14e9749 r57a2208  
    109109        }
    110110*/
    111 //      async_usleep(1000*1000);
    112111        /* audio_pcm_iface requires a single contiguous buffer */
    113112        buffer = AS_AREA_ANY;
  • uspace/srv/audio/hound/log.h

    rb14e9749 r57a2208  
    3737#define LOG_H_
    3838
     39#include <io/log.h>
     40
    3941#ifndef NAME
    4042#define NAME "NONAME"
     
    4345#include <stdio.h>
    4446
    45 #define log_fatal(msg, ...) printf(NAME ": Fatal: " msg "\n", ##__VA_ARGS__);
    46 #define log_error(msg, ...) printf(NAME ": Error: " msg "\n", ##__VA_ARGS__);
    47 #define log_warning(msg, ...) printf(NAME ": Warn: " msg "\n", ##__VA_ARGS__);
    48 #define log_info(msg, ...) printf(NAME ": Info: " msg "\n", ##__VA_ARGS__);
    49 #define log_debug(msg, ...) printf("%s: Debug: %s: " msg "\n", NAME, __FUNCTION__, ##__VA_ARGS__);
    50 #define log_verbose(msg, ...) printf("%s: %s: " msg "\n", NAME, __FUNCTION__, ##__VA_ARGS__);
     47#define log_fatal(...) log_msg(LOG_DEFAULT, LVL_FATAL, ##__VA_ARGS__);
     48#define log_error(...) log_msg(LOG_DEFAULT, LVL_ERROR, ##__VA_ARGS__);
     49#define log_warning(...) log_msg(LOG_DEFAULT, LVL_WARN, ##__VA_ARGS__);
     50#define log_info(...) log_msg(LOG_DEFAULT, LVL_NOTE, ##__VA_ARGS__);
     51#define log_debug(...) log_msg(LOG_DEFAULT, LVL_DEBUG, ##__VA_ARGS__);
     52#define log_verbose(...) log_msg(LOG_DEFAULT, LVL_DEBUG2, ##__VA_ARGS__);
    5153
    5254#endif
  • uspace/srv/audio/hound/main.c

    rb14e9749 r57a2208  
    7171        printf("%s: HelenOS sound service\n", NAME);
    7272
     73        if (log_init(NAME) != EOK) {
     74                printf(NAME ": Failed to initialize logging.\n");
     75                return 1;
     76        }
     77
    7378        int ret = hound_init(&hound);
    7479        if (ret != EOK) {
Note: See TracChangeset for help on using the changeset viewer.