diff options
Diffstat (limited to 'src/channel.c')
| -rw-r--r-- | src/channel.c | 30 | 
1 files changed, 30 insertions, 0 deletions
| diff --git a/src/channel.c b/src/channel.c index e6e6c3f..b9242c4 100644 --- a/src/channel.c +++ b/src/channel.c @@ -26,3 +26,33 @@ void channel_reset(struct channel_t *chan)  	chan->pos = 0;  	p_atomic_int_set(&(chan->active), false);  } + + +void channel_get_next_sample(float *left, float *right, struct channel_t *chan) +{ +	bool active = p_atomic_int_get(&(chan->active)); +	bool paused = p_atomic_int_get(&(chan->paused)); +	if (!active || paused) { +		/* skip this channel */ +		*left = 0; +		*right = 0; +		return; +	} + +	if (!p_mutex_trylock(chan->sound_mutex)) { +		/* can't lock mutex, skip */ +		*left = 0; +		*right = 0; +		return; +	} + +	*left = chan->sound.left[chan->pos]; +	*right = chan->sound.right[chan->pos]; +	chan->pos += 1; + +	if (chan->pos >= chan->sound.len) { +		channel_reset(chan); +	} + +	p_mutex_unlock(chan->sound_mutex); +} | 
