2 * QEMU OSS Audio output driver
4 * Copyright (c) 2003 Vassili Karpov (malc)
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
35 #include <sys/types.h>
36 #include <sys/ioctl.h>
37 #include <sys/soundcard.h>
40 /* http://www.df.lth.se/~john_e/gems/gem002d.html */
41 /* http://www.multi-platforms.com/Tips/PopCount.htm */
42 static inline uint32_t popcount (uint32_t u
)
44 u
= ((u
&0x55555555) + ((u
>>1)&0x55555555));
45 u
= ((u
&0x33333333) + ((u
>>2)&0x33333333));
46 u
= ((u
&0x0f0f0f0f) + ((u
>>4)&0x0f0f0f0f));
47 u
= ((u
&0x00ff00ff) + ((u
>>8)&0x00ff00ff));
48 u
= ( u
&0x0000ffff) + (u
>>16);
52 static inline uint32_t lsbindex (uint32_t u
)
54 return popcount ((u
&-u
)-1);
57 #define MIN(a, b) ((a)>(b)?(b):(a))
58 #define MAX(a, b) ((a)<(b)?(b):(a))
60 #define DEREF(x) (void)x
61 #define log(...) fprintf (stderr, "oss: " __VA_ARGS__)
62 #define ERRFail(...) do { \
64 fprintf (stderr, "oss: " __VA_ARGS__); \
65 fprintf (stderr, "system error: %s\n", strerror (_errno)); \
68 #define Fail(...) do { \
69 fprintf (stderr, "oss: " __VA_ARGS__); \
70 fprintf (stderr, "\n"); \
75 #define lwarn(...) fprintf (stderr, "oss: " __VA_ARGS__)
76 #define linfo(...) fprintf (stderr, "oss: " __VA_ARGS__)
77 #define ldebug(...) fprintf (stderr, "oss: " __VA_ARGS__)
85 #define IOCTL(args) do { \
86 int ret = ioctl args; \
90 ldebug ("ioctl " #args " = %d\n", ret); \
93 static int audio_fd
= -1;
95 static int conf_nfrags
= 4;
96 static int conf_fragsize
;
100 static int nchannels
;
107 static int bytes_per_second
;
109 static enum {DONT
, DSP
, TID
} estimate
= TID
;
111 static void (*copy_fn
)(void *, void *, int);
113 static void copy_no_conversion (void *dst
, void *src
, int size
)
115 memcpy (dst
, src
, size
);
118 static void copy_u16_to_s16 (void *dst
, void *src
, int size
)
126 for (i
= 0; i
< size
/ 2; i
++) {
127 out
[i
] = in
[i
] + 0x8000;
131 static void pab (struct audio_buf_info
*abinfo
)
135 ldebug ("fragments %d, fragstotal %d, fragsize %d, bytes %d\n"
136 "rpos %d, wpos %d, live %d\n",
144 void AUD_reset (int rfreq
, int rnchannels
, audfmt_e rfmt
)
149 if (-1 == audio_fd
) {
150 AUD_open (rfreq
, rnchannels
, rfmt
);
158 copy_fn
= copy_no_conversion
;
163 Fail ("can not play 8bit signed");
168 copy_fn
= copy_no_conversion
;
175 copy_fn
= copy_u16_to_s16
;
183 if ((fmt_
== fmt
) && (bits16
+ 1 == nchannels
) && (rfreq
== freq
))
186 AUD_open (rfreq
, rnchannels
, rfmt
);
190 void AUD_open (int rfreq
, int rnchannels
, audfmt_e rfmt
)
194 struct audio_buf_info abinfo
;
206 copy_fn
= copy_no_conversion
;
211 Fail ("can not play 8bit signed");
216 copy_fn
= copy_no_conversion
;
223 copy_fn
= copy_u16_to_s16
;
239 audio_fd
= open ("/dev/dsp", O_WRONLY
| O_NONBLOCK
);
240 if (-1 == audio_fd
) {
241 ERRFail ("can not open /dev/dsp");
246 _nchannels
= rnchannels
;
248 IOCTL ((audio_fd
, SNDCTL_DSP_RESET
, 1));
249 IOCTL ((audio_fd
, SNDCTL_DSP_SAMPLESIZE
, &_fmt
));
250 IOCTL ((audio_fd
, SNDCTL_DSP_CHANNELS
, &_nchannels
));
251 IOCTL ((audio_fd
, SNDCTL_DSP_SPEED
, &_freq
));
252 IOCTL ((audio_fd
, SNDCTL_DSP_NONBLOCK
));
256 The argument to this call is an integer encoded as 0xMMMMSSSS (in
257 hex). The 16 least significant bits determine the fragment
258 size. The size is 2^SSSS. For examp le SSSS=0008 gives fragment
259 size of 256 bytes (2^8). The minimum is 16 bytes (SSSS=4) and the
260 maximum is total_buffer_size/2. Some devices or processor
261 architectures may require larger fragments - in this case the
262 requested fragment size is automatically increased.
264 So ahem... 4096 = 2^12, and grand total 0x0004000c
267 mmmmssss
= (conf_nfrags
<< 16) | conf_fragsize
;
268 IOCTL ((audio_fd
, SNDCTL_DSP_SETFRAGMENT
, &mmmmssss
));
270 linfo ("_fmt = %d, fmt = %d\n"
271 "_channels = %d, rnchannels = %d\n"
272 "_freq = %d, freq = %d\n",
274 _nchannels
, rnchannels
,
278 Fail ("format %d != %d", _fmt
, fmt_
);
281 if (_nchannels
!= rnchannels
) {
282 Fail ("channels %d != %d", _nchannels
, rnchannels
);
285 if (_freq
!= rfreq
) {
286 Fail ("freq %d != %d", _freq
, rfreq
);
289 IOCTL ((audio_fd
, SNDCTL_DSP_GETOSPACE
, &abinfo
));
291 nfrags
= abinfo
.fragstotal
;
292 fragsize
= abinfo
.fragsize
;
295 nchannels
= rnchannels
;
296 atom
<<= nchannels
>> 1;
297 bufsize
= nfrags
* fragsize
;
299 bytes_per_second
= (freq
<< (nchannels
>> 1)) << bits16
;
301 linfo ("bytes per second %d\n", bytes_per_second
);
303 linfo ("fragments %d, fragstotal %d, fragsize %d, bytes %d, bufsize %d\n",
311 buf
= malloc (bufsize
);
322 int AUD_write (void *in_buf
, int size
)
327 to_copy
= MIN (bufsize
- live
, size
);
337 copy
= MIN (temp
, bufsize
- wpos
);
338 copy_fn (out
+ wpos
, in
, copy
);
341 if (wpos
== bufsize
) {
357 struct audio_buf_info abinfo
;
362 res
= ioctl (audio_fd
, SNDCTL_DSP_GETOSPACE
, &abinfo
);
368 lwarn ("SNDCTL_DSP_GETOSPACE failed with %s\n", strerror (err
));
371 bytes
= abinfo
.bytes
;
372 bytes
= MIN (live
, bytes
);
374 bytes
= (bytes
/ fragsize
) * fragsize
;
378 int left
, play
, written
;
380 left
= bufsize
- rpos
;
381 play
= MIN (left
, bytes
);
382 written
= write (audio_fd
, (void *) ((uint32_t) buf
+ rpos
), play
);
385 if (EAGAIN
== errno
|| EINTR
== errno
) {
389 ERRFail ("write audio");
398 if (rpos
== bufsize
) {
404 static int get_dsp_bytes (void)
407 struct count_info info
;
409 res
= ioctl (audio_fd
, SNDCTL_DSP_GETOPTR
, &info
);
414 lwarn ("SNDCTL_DSP_GETOPTR failed with %s\n", strerror (err
));
418 ldebug ("bytes %d\n", info
.bytes
);
423 void AUD_adjust_estimate (int _leftover
)
425 leftover
= _leftover
;
428 int AUD_get_free (void)
432 free
= bufsize
- live
;
444 static int old_bytes
;
447 bytes
= get_dsp_bytes ();
451 elapsed
= bytes
- old_bytes
;
453 ldebug ("dsp elapsed %d bytes\n", elapsed
);
459 static uint64_t old_ticks
;
460 uint64_t ticks
, delta
;
464 ticks
= qemu_get_clock(rt_clock
);
465 delta
= ticks
- old_ticks
;
468 ua_elapsed
= (delta
* bytes_per_second
) / 1000;
469 al_elapsed
= ua_elapsed
& ~3ULL;
471 ldebug ("tid elapsed %llu bytes\n", ua_elapsed
);
473 if (al_elapsed
> (uint64_t) INT_MAX
)
476 elapsed
= al_elapsed
;
482 if (elapsed
> free
) {
483 lwarn ("audio can not keep up elapsed %d free %d\n", elapsed
, free
);
491 int AUD_get_live (void)
496 int AUD_get_buffer_size (void)
504 int _fragsize
= 4096;
509 if (0 != (fsp
& (fsp
- 1))) {
510 Fail ("fragment size %d is not power of 2", fsp
);
513 conf_fragsize
= lsbindex (fsp
);
522 int AUD_write (void *in_buf
, int size
)
527 void AUD_reset (int rfreq
, int rnchannels
, audfmt_e rfmt
)
531 void AUD_adjust_estimate (int _leftover
)
535 int AUD_get_free (void)
540 int AUD_get_live (void)
545 int AUD_get_buffer_size (void)