Home | History | Annotate | Line # | Download | only in audio
audiodef.h revision 1.6
      1  1.6  isaki /*	$NetBSD: audiodef.h,v 1.6 2019/06/26 06:57:45 isaki Exp $	*/
      2  1.2  isaki 
      3  1.2  isaki /*
      4  1.2  isaki  * Copyright (C) 2017 Tetsuya Isaki. All rights reserved.
      5  1.2  isaki  * Copyright (C) 2017 Y.Sugahara (moveccr). All rights reserved.
      6  1.2  isaki  *
      7  1.2  isaki  * Redistribution and use in source and binary forms, with or without
      8  1.2  isaki  * modification, are permitted provided that the following conditions
      9  1.2  isaki  * are met:
     10  1.2  isaki  * 1. Redistributions of source code must retain the above copyright
     11  1.2  isaki  *    notice, this list of conditions and the following disclaimer.
     12  1.2  isaki  * 2. Redistributions in binary form must reproduce the above copyright
     13  1.2  isaki  *    notice, this list of conditions and the following disclaimer in the
     14  1.2  isaki  *    documentation and/or other materials provided with the distribution.
     15  1.2  isaki  *
     16  1.2  isaki  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     17  1.2  isaki  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     18  1.2  isaki  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     19  1.2  isaki  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     20  1.2  isaki  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     21  1.2  isaki  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     22  1.2  isaki  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     23  1.2  isaki  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     24  1.2  isaki  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     25  1.2  isaki  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26  1.2  isaki  * SUCH DAMAGE.
     27  1.2  isaki  */
     28  1.2  isaki 
     29  1.2  isaki #ifndef _SYS_DEV_AUDIO_AUDIODEF_H_
     30  1.2  isaki #define _SYS_DEV_AUDIO_AUDIODEF_H_
     31  1.2  isaki 
     32  1.2  isaki /* Number of HW buffer's blocks. */
     33  1.2  isaki #define NBLKHW (3)
     34  1.2  isaki 
     35  1.2  isaki /* Number of track output buffer's blocks.  Must be > NBLKHW */
     36  1.2  isaki #define NBLKOUT	(4)
     37  1.2  isaki 
     38  1.2  isaki /* Minimum number of usrbuf's blocks. */
     39  1.2  isaki #define AUMINNOBLK	(3)
     40  1.2  isaki 
     41  1.2  isaki /*
     42  1.2  isaki  * Hardware blocksize in msec.
     43  1.2  isaki  * We use 40 msec as default.  (1 / 40ms) = 25 = 5^2.
     44  1.2  isaki  * In this case, the number of frames in a block can be an integer
     45  1.2  isaki  * even if the frequency is a multiple of 100 (44100, 48000, etc),
     46  1.2  isaki  * or even if 15625Hz (vs(4)).
     47  1.2  isaki  */
     48  1.2  isaki #if !defined(AUDIO_BLK_MS)
     49  1.2  isaki #define AUDIO_BLK_MS 40
     50  1.2  isaki #endif
     51  1.2  isaki 
     52  1.2  isaki /*
     53  1.2  isaki  * Whether the playback mixer use single buffer mode.
     54  1.2  isaki  * It reduces the latency one block but needs machine power.
     55  1.2  isaki  * In case of the double buffer (as default), it increases the latency
     56  1.2  isaki  * but can be expected to stabilize even on slower machines.
     57  1.2  isaki  */
     58  1.2  isaki /* #define AUDIO_HW_SINGLE_BUFFER */
     59  1.2  isaki 
     60  1.2  isaki /*
     61  1.2  isaki  * Whether supports per-track volume.
     62  1.2  isaki  * For now, there are no user interfaces to get/set it.
     63  1.2  isaki  */
     64  1.2  isaki /* #define AUDIO_SUPPORT_TRACK_VOLUME */
     65  1.2  isaki 
     66  1.6  isaki /*
     67  1.6  isaki  * AUDIO_SCALEDOWN()
     68  1.6  isaki  * This macro should be used for audio wave data only.
     69  1.6  isaki  *
     70  1.6  isaki  * The arithmetic shift right (ASR) (in other words, floor()) is good for
     71  1.6  isaki  * this purpose, and will be faster than division on the most platform.
     72  1.6  isaki  * The division (in other words, truncate()) is not so bad alternate for
     73  1.6  isaki  * this purpose, and will be fast enough.
     74  1.6  isaki  * (Using ASR is 1.9 times faster than division on my amd64, and 1.3 times
     75  1.6  isaki  * faster on my m68k.  -- isaki 201801.)
     76  1.6  isaki  *
     77  1.6  isaki  * However, the right shift operator ('>>') for negative integer is
     78  1.6  isaki  * "implementation defined" behavior in C (note that it's not "undefined"
     79  1.6  isaki  * behavior).  So only if implementation defines '>>' as ASR, we use it.
     80  1.6  isaki  */
     81  1.6  isaki #if defined(__GNUC__)
     82  1.6  isaki /* gcc defines '>>' as ASR. */
     83  1.6  isaki #define AUDIO_SCALEDOWN(value, bits)	((value) >> (bits))
     84  1.6  isaki #else
     85  1.6  isaki #define AUDIO_SCALEDOWN(value, bits)	((value) / (1 << (bits)))
     86  1.6  isaki #endif
     87  1.6  isaki 
     88  1.2  isaki /* conversion stage */
     89  1.2  isaki typedef struct {
     90  1.2  isaki 	audio_ring_t srcbuf;
     91  1.2  isaki 	audio_ring_t *dst;
     92  1.2  isaki 	audio_filter_t filter;
     93  1.2  isaki 	audio_filter_arg_t arg;
     94  1.2  isaki } audio_stage_t;
     95  1.2  isaki 
     96  1.2  isaki typedef enum {
     97  1.2  isaki 	AUDIO_STATE_CLEAR,	/* no data, no need to drain */
     98  1.2  isaki 	AUDIO_STATE_RUNNING,	/* need to drain */
     99  1.2  isaki 	AUDIO_STATE_DRAINING,	/* now draining */
    100  1.2  isaki } audio_state_t;
    101  1.2  isaki 
    102  1.2  isaki typedef struct audio_track {
    103  1.2  isaki 	/*
    104  1.2  isaki 	 * AUMODE_PLAY for playback track, or
    105  1.2  isaki 	 * AUMODE_RECORD for recoding track.
    106  1.2  isaki 	 * Note that AUMODE_PLAY_ALL is maintained by file->mode, not here.
    107  1.2  isaki 	 */
    108  1.2  isaki 	int mode;
    109  1.2  isaki 
    110  1.2  isaki 	audio_ring_t	usrbuf;		/* user i/o buffer */
    111  1.2  isaki 	u_int		usrbuf_blksize;	/* usrbuf block size in bytes */
    112  1.2  isaki 	struct uvm_object *uobj;
    113  1.2  isaki 	bool		mmapped;	/* device is mmap()-ed */
    114  1.2  isaki 	u_int		usrbuf_stamp;	/* transferred bytes from/to stage */
    115  1.2  isaki 	u_int		usrbuf_stamp_last; /* last stamp */
    116  1.2  isaki 	u_int		usrbuf_usedhigh;/* high water mark in bytes */
    117  1.2  isaki 	u_int		usrbuf_usedlow;	/* low water mark in bytes */
    118  1.2  isaki 
    119  1.2  isaki 	/*
    120  1.2  isaki 	 * Track input format.  It means usrbuf.fmt for playback, or
    121  1.2  isaki 	 * mixer->trackfmt for recording.
    122  1.2  isaki 	 */
    123  1.2  isaki 	audio_format2_t	inputfmt;
    124  1.2  isaki 
    125  1.2  isaki 	/*
    126  1.2  isaki 	 * Pointer to track (conversion stage's) input buffer.
    127  1.2  isaki 	 * Must be protected by track lock (only for recording track).
    128  1.2  isaki 	 */
    129  1.2  isaki 	audio_ring_t	*input;
    130  1.2  isaki 	/*
    131  1.2  isaki 	 * Track (conversion stage's) output buffer.
    132  1.2  isaki 	 * Must be protected by track lock (only for playback track).
    133  1.2  isaki 	 */
    134  1.2  isaki 	audio_ring_t	outbuf;
    135  1.2  isaki 
    136  1.2  isaki 	audio_stage_t	codec;		/* encoding conversion stage */
    137  1.2  isaki 	audio_stage_t	chvol;		/* channel volume stage */
    138  1.2  isaki 	audio_stage_t	chmix;		/* channel mix stage */
    139  1.2  isaki 	audio_stage_t	freq;		/* frequency conversion stage */
    140  1.2  isaki 
    141  1.2  isaki 	/* Work area for frequency conversion.  */
    142  1.2  isaki 	u_int		freq_step;	/* src/dst ratio */
    143  1.2  isaki 	u_int		freq_current;	/* counter */
    144  1.2  isaki 	u_int		freq_leap;	/* correction counter per block */
    145  1.2  isaki 	aint_t		freq_prev[AUDIO_MAX_CHANNELS];	/* previous values */
    146  1.2  isaki 	aint_t		freq_curr[AUDIO_MAX_CHANNELS];	/* current values */
    147  1.2  isaki 
    148  1.2  isaki 	/* Per-channel volumes (0..256) */
    149  1.2  isaki 	uint16_t ch_volume[AUDIO_MAX_CHANNELS];
    150  1.2  isaki #if defined(AUDIO_SUPPORT_TRACK_VOLUME)
    151  1.2  isaki 	/* Track volume (0..256) */
    152  1.2  isaki 	u_int		volume;
    153  1.2  isaki #endif
    154  1.2  isaki 
    155  1.2  isaki 	audio_trackmixer_t *mixer;	/* connected track mixer */
    156  1.2  isaki 
    157  1.2  isaki 	/* Sequence number picked up by track mixer. */
    158  1.2  isaki 	uint64_t	seq;
    159  1.2  isaki 
    160  1.2  isaki 	audio_state_t	pstate;		/* playback state */
    161  1.2  isaki 	bool		is_pause;
    162  1.2  isaki 
    163  1.2  isaki 	/* Statistic counters. */
    164  1.2  isaki 	uint64_t	inputcounter;	/* # of frames input to track */
    165  1.2  isaki 	uint64_t	outputcounter;	/* # of frames output from track */
    166  1.2  isaki 	uint64_t	useriobytes;	/* # of bytes xfer to/from userland */
    167  1.2  isaki 	uint64_t	dropframes;	/* # of frames dropped */
    168  1.2  isaki 	int		eofcounter;	/* count of zero-sized write */
    169  1.2  isaki 
    170  1.2  isaki 	/*
    171  1.2  isaki 	 * Non-zero if the track is in use.
    172  1.2  isaki 	 * Must access atomically.
    173  1.2  isaki 	 */
    174  1.2  isaki 	volatile uint	lock;
    175  1.2  isaki 
    176  1.2  isaki 	int		id;		/* track id for debug */
    177  1.2  isaki } audio_track_t;
    178  1.2  isaki 
    179  1.2  isaki struct audio_file {
    180  1.2  isaki 	struct audio_softc *sc;
    181  1.2  isaki 	dev_t		dev;
    182  1.2  isaki 
    183  1.2  isaki 	/*
    184  1.2  isaki 	 * Playback and recording track, or NULL if the track is unavailable.
    185  1.2  isaki 	 */
    186  1.2  isaki 	audio_track_t	*ptrack;
    187  1.2  isaki 	audio_track_t	*rtrack;
    188  1.2  isaki 
    189  1.2  isaki 	/*
    190  1.2  isaki 	 * Indicates the operation mode of this file.
    191  1.2  isaki 	 * AUMODE_PLAY means playback is requested.
    192  1.2  isaki 	 * AUMODE_RECORD means recording is requested.
    193  1.2  isaki 	 * AUMODE_PLAY_ALL affects nothing but can be get/set for backward
    194  1.2  isaki 	 * compatibility.
    195  1.2  isaki 	 */
    196  1.2  isaki 	int		mode;
    197  1.2  isaki 
    198  1.2  isaki 	/* process who wants audio SIGIO. */
    199  1.2  isaki 	pid_t		async_audio;
    200  1.2  isaki 
    201  1.2  isaki 	SLIST_ENTRY(audio_file) entry;
    202  1.2  isaki };
    203  1.2  isaki 
    204  1.2  isaki struct audio_trackmixer {
    205  1.2  isaki 	struct audio_softc *sc;
    206  1.2  isaki 
    207  1.2  isaki 	int		mode;		/* AUMODE_PLAY or AUMODE_RECORD */
    208  1.2  isaki 	audio_format2_t	track_fmt;	/* track <-> trackmixer format */
    209  1.2  isaki 
    210  1.2  isaki 	int		frames_per_block; /* number of frames in a block */
    211  1.2  isaki 
    212  1.5  isaki 	/*
    213  1.5  isaki 	 * software master volume (0..256)
    214  1.5  isaki 	 * Must be protected by sc_intr_lock.
    215  1.5  isaki 	 */
    216  1.5  isaki 	u_int		volume;
    217  1.2  isaki 
    218  1.2  isaki 	audio_format2_t	mixfmt;
    219  1.2  isaki 	void		*mixsample;	/* mixing buf in double-sized int */
    220  1.2  isaki 
    221  1.2  isaki 	/*
    222  1.2  isaki 	 * true if trackmixer does LE<->BE conversion.
    223  1.2  isaki 	 * Generally an encoding conversion should be done by each hardware
    224  1.2  isaki 	 * driver but for most modern little endian drivers which support
    225  1.2  isaki 	 * only linear PCM it's troublesome issue to consider about big endian
    226  1.2  isaki 	 * arch.  Therefore, we do this conversion here only if the hardware
    227  1.2  isaki 	 * format is SLINEAR_OE:16.
    228  1.2  isaki 	 */
    229  1.2  isaki 	bool		swap_endian;
    230  1.2  isaki 
    231  1.2  isaki 	audio_filter_t	codec;		/* hardware codec */
    232  1.2  isaki 	audio_filter_arg_t codecarg;	/* and its argument */
    233  1.2  isaki 	audio_ring_t	codecbuf;	/* also used for wide->int conversion */
    234  1.2  isaki 
    235  1.2  isaki 	audio_ring_t	hwbuf;		/* HW I/O buf */
    236  1.2  isaki 
    237  1.2  isaki 	void		*sih;		/* softint cookie */
    238  1.2  isaki 
    239  1.2  isaki 	/* Must be protected by sc_lock. */
    240  1.2  isaki 	kcondvar_t	outcv;
    241  1.2  isaki 
    242  1.2  isaki 	uint64_t	mixseq;		/* seq# currently being mixed */
    243  1.2  isaki 	uint64_t	hwseq;		/* seq# HW output completed */
    244  1.2  isaki 
    245  1.2  isaki 	/* initial blktime n/d = AUDIO_BLK_MS / 1000 */
    246  1.2  isaki 	int		blktime_n;	/* blk time numerator */
    247  1.2  isaki 	int		blktime_d;	/* blk time denominator */
    248  1.2  isaki 
    249  1.2  isaki 	/* XXX */
    250  1.2  isaki 	uint64_t	hw_complete_counter;
    251  1.2  isaki };
    252  1.2  isaki 
    253  1.2  isaki /*
    254  1.2  isaki  * Audio Ring Buffer.
    255  1.2  isaki  */
    256  1.2  isaki 
    257  1.2  isaki #ifdef DIAGNOSTIC
    258  1.2  isaki #define DIAGNOSTIC_ring(ring)	audio_diagnostic_ring(__func__, (ring))
    259  1.2  isaki extern void audio_diagnostic_ring(const char *, const audio_ring_t *);
    260  1.2  isaki #else
    261  1.2  isaki #define DIAGNOSTIC_ring(ring)
    262  1.2  isaki #endif
    263  1.2  isaki 
    264  1.2  isaki /*
    265  1.2  isaki  * Convert number of frames to number of bytes.
    266  1.2  isaki  */
    267  1.2  isaki static __inline int
    268  1.2  isaki frametobyte(const audio_format2_t *fmt, int frames)
    269  1.2  isaki {
    270  1.2  isaki 	return frames * fmt->channels * fmt->stride / NBBY;
    271  1.2  isaki }
    272  1.2  isaki 
    273  1.2  isaki /*
    274  1.2  isaki  * Return the number of frames per block.
    275  1.2  isaki  */
    276  1.2  isaki static __inline int
    277  1.2  isaki frame_per_block(const audio_trackmixer_t *mixer, const audio_format2_t *fmt)
    278  1.2  isaki {
    279  1.2  isaki 	return (fmt->sample_rate * mixer->blktime_n + mixer->blktime_d - 1) /
    280  1.2  isaki 	    mixer->blktime_d;
    281  1.2  isaki }
    282  1.2  isaki 
    283  1.2  isaki /*
    284  1.2  isaki  * Round idx.  idx must be non-negative and less than 2 * capacity.
    285  1.2  isaki  */
    286  1.2  isaki static __inline int
    287  1.2  isaki auring_round(const audio_ring_t *ring, int idx)
    288  1.2  isaki {
    289  1.2  isaki 	DIAGNOSTIC_ring(ring);
    290  1.2  isaki 	KASSERT(idx >= 0);
    291  1.2  isaki 	KASSERT(idx < ring->capacity * 2);
    292  1.2  isaki 
    293  1.2  isaki 	if (idx < ring->capacity) {
    294  1.2  isaki 		return idx;
    295  1.2  isaki 	} else {
    296  1.2  isaki 		return idx - ring->capacity;
    297  1.2  isaki 	}
    298  1.2  isaki }
    299  1.2  isaki 
    300  1.2  isaki /*
    301  1.2  isaki  * Return ring's tail (= head + used) position.
    302  1.2  isaki  * This position indicates next frame of the last valid frames.
    303  1.2  isaki  */
    304  1.2  isaki static __inline int
    305  1.2  isaki auring_tail(const audio_ring_t *ring)
    306  1.2  isaki {
    307  1.2  isaki 	return auring_round(ring, ring->head + ring->used);
    308  1.2  isaki }
    309  1.2  isaki 
    310  1.2  isaki /*
    311  1.2  isaki  * Return ring's head pointer.
    312  1.2  isaki  * This function can be used only if the stride of the 'ring' is equal to
    313  1.2  isaki  * the internal stride.  Don't use this for hw buffer.
    314  1.2  isaki  */
    315  1.2  isaki static __inline aint_t *
    316  1.2  isaki auring_headptr_aint(const audio_ring_t *ring)
    317  1.2  isaki {
    318  1.2  isaki 	KASSERT(ring->fmt.stride == sizeof(aint_t) * NBBY);
    319  1.2  isaki 
    320  1.2  isaki 	return (aint_t *)ring->mem + ring->head * ring->fmt.channels;
    321  1.2  isaki }
    322  1.2  isaki 
    323  1.2  isaki /*
    324  1.2  isaki  * Return ring's tail (= head + used) pointer.
    325  1.2  isaki  * This function can be used only if the stride of the 'ring' is equal to
    326  1.2  isaki  * the internal stride.  Don't use this for hw buffer.
    327  1.2  isaki  */
    328  1.2  isaki static __inline aint_t *
    329  1.2  isaki auring_tailptr_aint(const audio_ring_t *ring)
    330  1.2  isaki {
    331  1.2  isaki 	KASSERT(ring->fmt.stride == sizeof(aint_t) * NBBY);
    332  1.2  isaki 
    333  1.2  isaki 	return (aint_t *)ring->mem + auring_tail(ring) * ring->fmt.channels;
    334  1.2  isaki }
    335  1.2  isaki 
    336  1.2  isaki /*
    337  1.2  isaki  * Return ring's head pointer.
    338  1.2  isaki  * This function can be used even if the stride of the 'ring' is equal to
    339  1.2  isaki  * or not equal to the internal stride.
    340  1.2  isaki  */
    341  1.2  isaki static __inline uint8_t *
    342  1.2  isaki auring_headptr(const audio_ring_t *ring)
    343  1.2  isaki {
    344  1.2  isaki 	return (uint8_t *)ring->mem +
    345  1.2  isaki 	    ring->head * ring->fmt.channels * ring->fmt.stride / NBBY;
    346  1.2  isaki }
    347  1.2  isaki 
    348  1.2  isaki /*
    349  1.2  isaki  * Return ring's tail pointer.
    350  1.2  isaki  * It points the next position of the last valid frames.
    351  1.2  isaki  * This function can be used even if the stride of the 'ring' is equal to
    352  1.2  isaki  * or not equal to the internal stride.
    353  1.2  isaki  */
    354  1.2  isaki static __inline uint8_t *
    355  1.2  isaki auring_tailptr(audio_ring_t *ring)
    356  1.2  isaki {
    357  1.2  isaki 	return (uint8_t *)ring->mem +
    358  1.2  isaki 	    auring_tail(ring) * ring->fmt.channels * ring->fmt.stride / NBBY;
    359  1.2  isaki }
    360  1.2  isaki 
    361  1.2  isaki /*
    362  1.2  isaki  * Return ring's capacity in bytes.
    363  1.2  isaki  */
    364  1.2  isaki static __inline int
    365  1.2  isaki auring_bytelen(const audio_ring_t *ring)
    366  1.2  isaki {
    367  1.2  isaki 	return frametobyte(&ring->fmt, ring->capacity);
    368  1.2  isaki }
    369  1.2  isaki 
    370  1.2  isaki /*
    371  1.2  isaki  * Take out n frames from head of ring.
    372  1.2  isaki  * This function only manipurates counters.  It doesn't manipurate any
    373  1.2  isaki  * actual buffer data.
    374  1.2  isaki  */
    375  1.2  isaki #define auring_take(ring, n)	auring_take_(__func__, __LINE__, ring, n)
    376  1.2  isaki static __inline void
    377  1.2  isaki auring_take_(const char *func, int line, audio_ring_t *ring, int n)
    378  1.2  isaki {
    379  1.2  isaki 	DIAGNOSTIC_ring(ring);
    380  1.2  isaki 	KASSERTMSG(n >= 0, "called from %s:%d: n=%d", func, line, n);
    381  1.2  isaki 	KASSERTMSG(ring->used >= n, "called from %s:%d: ring->used=%d n=%d",
    382  1.2  isaki 	    func, line, ring->used, n);
    383  1.2  isaki 
    384  1.2  isaki 	ring->head = auring_round(ring, ring->head + n);
    385  1.2  isaki 	ring->used -= n;
    386  1.2  isaki }
    387  1.2  isaki 
    388  1.2  isaki /*
    389  1.2  isaki  * Append n frames into tail of ring.
    390  1.2  isaki  * This function only manipurates counters.  It doesn't manipurate any
    391  1.2  isaki  * actual buffer data.
    392  1.2  isaki  */
    393  1.2  isaki #define auring_push(ring, n)	auring_push_(__func__, __LINE__, ring, n)
    394  1.2  isaki static __inline void
    395  1.2  isaki auring_push_(const char *func, int line, audio_ring_t *ring, int n)
    396  1.2  isaki {
    397  1.2  isaki 	DIAGNOSTIC_ring(ring);
    398  1.2  isaki 	KASSERT(n >= 0);
    399  1.2  isaki 	KASSERTMSG(ring->used + n <= ring->capacity,
    400  1.2  isaki 	    "called from %s:%d: ring->used=%d n=%d ring->capacity=%d",
    401  1.2  isaki 	    func, line, ring->used, n, ring->capacity);
    402  1.2  isaki 
    403  1.2  isaki 	ring->used += n;
    404  1.2  isaki }
    405  1.2  isaki 
    406  1.2  isaki /*
    407  1.2  isaki  * Return the number of contiguous frames in used.
    408  1.2  isaki  */
    409  1.2  isaki static __inline int
    410  1.2  isaki auring_get_contig_used(const audio_ring_t *ring)
    411  1.2  isaki {
    412  1.2  isaki 	DIAGNOSTIC_ring(ring);
    413  1.2  isaki 
    414  1.2  isaki 	if (ring->head + ring->used <= ring->capacity) {
    415  1.2  isaki 		return ring->used;
    416  1.2  isaki 	} else {
    417  1.2  isaki 		return ring->capacity - ring->head;
    418  1.2  isaki 	}
    419  1.2  isaki }
    420  1.2  isaki 
    421  1.2  isaki /*
    422  1.2  isaki  * Return the number of contiguous free frames.
    423  1.2  isaki  */
    424  1.2  isaki static __inline int
    425  1.2  isaki auring_get_contig_free(const audio_ring_t *ring)
    426  1.2  isaki {
    427  1.2  isaki 	DIAGNOSTIC_ring(ring);
    428  1.2  isaki 
    429  1.2  isaki 	if (ring->head + ring->used < ring->capacity) {
    430  1.2  isaki 		return ring->capacity - (ring->head + ring->used);
    431  1.2  isaki 	} else {
    432  1.2  isaki 		return ring->capacity - ring->used;
    433  1.2  isaki 	}
    434  1.2  isaki }
    435  1.2  isaki 
    436  1.2  isaki #endif /* !_SYS_DEV_AUDIO_AUDIODEF_H_ */
    437