symbian-qemu-0.9.1-12/qemu-symbian-svp/audio/audio_pt_int.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 #include "qemu-common.h"
       
     2 #include "audio.h"
       
     3 
       
     4 #define AUDIO_CAP "audio-pt"
       
     5 
       
     6 #include "audio_int.h"
       
     7 #include "audio_pt_int.h"
       
     8 
       
     9 static void logerr (struct audio_pt *pt, int err, const char *fmt, ...)
       
    10 {
       
    11     va_list ap;
       
    12 
       
    13     va_start (ap, fmt);
       
    14     AUD_vlog (pt->drv, fmt, ap);
       
    15     va_end (ap);
       
    16 
       
    17     AUD_log (NULL, "\n");
       
    18     AUD_log (pt->drv, "Reason: %s\n", strerror (err));
       
    19 }
       
    20 
       
    21 int audio_pt_init (struct audio_pt *p, void *(*func) (void *),
       
    22                    void *opaque, const char *drv, const char *cap)
       
    23 {
       
    24     int err, err2;
       
    25     const char *efunc;
       
    26 
       
    27     p->drv = drv;
       
    28 
       
    29     err = pthread_mutex_init (&p->mutex, NULL);
       
    30     if (err) {
       
    31         efunc = "pthread_mutex_init";
       
    32         goto err0;
       
    33     }
       
    34 
       
    35     err = pthread_cond_init (&p->cond, NULL);
       
    36     if (err) {
       
    37         efunc = "pthread_cond_init";
       
    38         goto err1;
       
    39     }
       
    40 
       
    41     err = pthread_create (&p->thread, NULL, func, opaque);
       
    42     if (err) {
       
    43         efunc = "pthread_create";
       
    44         goto err2;
       
    45     }
       
    46 
       
    47     return 0;
       
    48 
       
    49  err2:
       
    50     err2 = pthread_cond_destroy (&p->cond);
       
    51     if (err2) {
       
    52         logerr (p, err2, "%s(%s): pthread_cond_destroy failed", cap, AUDIO_FUNC);
       
    53     }
       
    54 
       
    55  err1:
       
    56     err2 = pthread_mutex_destroy (&p->mutex);
       
    57     if (err2) {
       
    58         logerr (p, err2, "%s(%s): pthread_mutex_destroy failed", cap, AUDIO_FUNC);
       
    59     }
       
    60 
       
    61  err0:
       
    62     logerr (p, err, "%s(%s): %s failed", cap, AUDIO_FUNC, efunc);
       
    63     return -1;
       
    64 }
       
    65 
       
    66 int audio_pt_fini (struct audio_pt *p, const char *cap)
       
    67 {
       
    68     int err, ret = 0;
       
    69 
       
    70     err = pthread_cond_destroy (&p->cond);
       
    71     if (err) {
       
    72         logerr (p, err, "%s(%s): pthread_cond_destroy failed", cap, AUDIO_FUNC);
       
    73         ret = -1;
       
    74     }
       
    75 
       
    76     err = pthread_mutex_destroy (&p->mutex);
       
    77     if (err) {
       
    78         logerr (p, err, "%s(%s): pthread_mutex_destroy failed", cap, AUDIO_FUNC);
       
    79         ret = -1;
       
    80     }
       
    81     return ret;
       
    82 }
       
    83 
       
    84 int audio_pt_lock (struct audio_pt *p, const char *cap)
       
    85 {
       
    86     int err;
       
    87 
       
    88     err = pthread_mutex_lock (&p->mutex);
       
    89     if (err) {
       
    90         logerr (p, err, "%s(%s): pthread_mutex_lock failed", cap, AUDIO_FUNC);
       
    91         return -1;
       
    92     }
       
    93     return 0;
       
    94 }
       
    95 
       
    96 int audio_pt_unlock (struct audio_pt *p, const char *cap)
       
    97 {
       
    98     int err;
       
    99 
       
   100     err = pthread_mutex_unlock (&p->mutex);
       
   101     if (err) {
       
   102         logerr (p, err, "%s(%s): pthread_mutex_unlock failed", cap, AUDIO_FUNC);
       
   103         return -1;
       
   104     }
       
   105     return 0;
       
   106 }
       
   107 
       
   108 int audio_pt_wait (struct audio_pt *p, const char *cap)
       
   109 {
       
   110     int err;
       
   111 
       
   112     err = pthread_cond_wait (&p->cond, &p->mutex);
       
   113     if (err) {
       
   114         logerr (p, err, "%s(%s): pthread_cond_wait failed", cap, AUDIO_FUNC);
       
   115         return -1;
       
   116     }
       
   117     return 0;
       
   118 }
       
   119 
       
   120 int audio_pt_unlock_and_signal (struct audio_pt *p, const char *cap)
       
   121 {
       
   122     int err;
       
   123 
       
   124     err = pthread_mutex_unlock (&p->mutex);
       
   125     if (err) {
       
   126         logerr (p, err, "%s(%s): pthread_mutex_unlock failed", cap, AUDIO_FUNC);
       
   127         return -1;
       
   128     }
       
   129     err = pthread_cond_signal (&p->cond);
       
   130     if (err) {
       
   131         logerr (p, err, "%s(%s): pthread_cond_signal failed", cap, AUDIO_FUNC);
       
   132         return -1;
       
   133     }
       
   134     return 0;
       
   135 }
       
   136 
       
   137 int audio_pt_join (struct audio_pt *p, void **arg, const char *cap)
       
   138 {
       
   139     int err;
       
   140     void *ret;
       
   141 
       
   142     err = pthread_join (p->thread, &ret);
       
   143     if (err) {
       
   144         logerr (p, err, "%s(%s): pthread_join failed", cap, AUDIO_FUNC);
       
   145         return -1;
       
   146     }
       
   147     *arg = ret;
       
   148     return 0;
       
   149 }