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