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