audio: make mixeng optional
Implementation of the previously added mixing-engine option. Signed-off-by: Kővágó, Zoltán <DirtY.iCE.hu@gmail.com> Message-id: c05bc258889ed289e8ee1bdbcc5e84174ec221e7.1570996490.git.DirtY.iCE.hu@gmail.com Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
8efac073a5
commit
1930616b98
@ -838,32 +838,46 @@ static void audio_timer (void *opaque)
|
||||
*/
|
||||
size_t AUD_write(SWVoiceOut *sw, void *buf, size_t size)
|
||||
{
|
||||
HWVoiceOut *hw;
|
||||
|
||||
if (!sw) {
|
||||
/* XXX: Consider options */
|
||||
return size;
|
||||
}
|
||||
hw = sw->hw;
|
||||
|
||||
if (!sw->hw->enabled) {
|
||||
if (!hw->enabled) {
|
||||
dolog ("Writing to disabled voice %s\n", SW_NAME (sw));
|
||||
return 0;
|
||||
}
|
||||
|
||||
return audio_pcm_sw_write(sw, buf, size);
|
||||
if (audio_get_pdo_out(hw->s->dev)->mixing_engine) {
|
||||
return audio_pcm_sw_write(sw, buf, size);
|
||||
} else {
|
||||
return hw->pcm_ops->write(hw, buf, size);
|
||||
}
|
||||
}
|
||||
|
||||
size_t AUD_read(SWVoiceIn *sw, void *buf, size_t size)
|
||||
{
|
||||
HWVoiceIn *hw;
|
||||
|
||||
if (!sw) {
|
||||
/* XXX: Consider options */
|
||||
return size;
|
||||
}
|
||||
hw = sw->hw;
|
||||
|
||||
if (!sw->hw->enabled) {
|
||||
if (!hw->enabled) {
|
||||
dolog ("Reading from disabled voice %s\n", SW_NAME (sw));
|
||||
return 0;
|
||||
}
|
||||
|
||||
return audio_pcm_sw_read(sw, buf, size);
|
||||
if (audio_get_pdo_in(hw->s->dev)->mixing_engine) {
|
||||
return audio_pcm_sw_read(sw, buf, size);
|
||||
} else {
|
||||
return hw->pcm_ops->read(hw, buf, size);
|
||||
}
|
||||
}
|
||||
|
||||
int AUD_get_buffer_size_out (SWVoiceOut *sw)
|
||||
@ -1090,6 +1104,26 @@ static void audio_run_out (AudioState *s)
|
||||
HWVoiceOut *hw = NULL;
|
||||
SWVoiceOut *sw;
|
||||
|
||||
if (!audio_get_pdo_out(s->dev)->mixing_engine) {
|
||||
while ((hw = audio_pcm_hw_find_any_enabled_out(s, hw))) {
|
||||
/* there is exactly 1 sw for each hw with no mixeng */
|
||||
sw = hw->sw_head.lh_first;
|
||||
|
||||
if (hw->pending_disable) {
|
||||
hw->enabled = 0;
|
||||
hw->pending_disable = 0;
|
||||
if (hw->pcm_ops->enable_out) {
|
||||
hw->pcm_ops->enable_out(hw, false);
|
||||
}
|
||||
}
|
||||
|
||||
if (sw->active) {
|
||||
sw->callback.fn(sw->callback.opaque, INT_MAX);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
while ((hw = audio_pcm_hw_find_any_enabled_out(s, hw))) {
|
||||
size_t played, live, prev_rpos, free;
|
||||
int nb_live, cleanup_required;
|
||||
@ -1227,6 +1261,17 @@ static void audio_run_in (AudioState *s)
|
||||
{
|
||||
HWVoiceIn *hw = NULL;
|
||||
|
||||
if (!audio_get_pdo_in(s->dev)->mixing_engine) {
|
||||
while ((hw = audio_pcm_hw_find_any_enabled_in(s, hw))) {
|
||||
/* there is exactly 1 sw for each hw with no mixeng */
|
||||
SWVoiceIn *sw = hw->sw_head.lh_first;
|
||||
if (sw->active) {
|
||||
sw->callback.fn(sw->callback.opaque, INT_MAX);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
while ((hw = audio_pcm_hw_find_any_enabled_in(s, hw))) {
|
||||
SWVoiceIn *sw;
|
||||
size_t captured = 0, min;
|
||||
@ -1751,6 +1796,11 @@ CaptureVoiceOut *AUD_add_capture(
|
||||
s = audio_init(NULL, NULL);
|
||||
}
|
||||
|
||||
if (!audio_get_pdo_out(s->dev)->mixing_engine) {
|
||||
dolog("Can't capture with mixeng disabled\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (audio_validate_settings (as)) {
|
||||
dolog ("Invalid settings were passed when trying to add capture\n");
|
||||
audio_print_settings (as);
|
||||
@ -1905,9 +1955,13 @@ void audio_create_pdos(Audiodev *dev)
|
||||
static void audio_validate_per_direction_opts(
|
||||
AudiodevPerDirectionOptions *pdo, Error **errp)
|
||||
{
|
||||
if (!pdo->has_mixing_engine) {
|
||||
pdo->has_mixing_engine = true;
|
||||
pdo->mixing_engine = true;
|
||||
}
|
||||
if (!pdo->has_fixed_settings) {
|
||||
pdo->has_fixed_settings = true;
|
||||
pdo->fixed_settings = true;
|
||||
pdo->fixed_settings = pdo->mixing_engine;
|
||||
}
|
||||
if (!pdo->fixed_settings &&
|
||||
(pdo->has_frequency || pdo->has_channels || pdo->has_format)) {
|
||||
@ -1915,6 +1969,10 @@ static void audio_validate_per_direction_opts(
|
||||
"You can't use frequency, channels or format with fixed-settings=off");
|
||||
return;
|
||||
}
|
||||
if (!pdo->mixing_engine && pdo->fixed_settings) {
|
||||
error_setg(errp, "You can't use fixed-settings without mixeng");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!pdo->has_frequency) {
|
||||
pdo->has_frequency = true;
|
||||
@ -1926,7 +1984,7 @@ static void audio_validate_per_direction_opts(
|
||||
}
|
||||
if (!pdo->has_voices) {
|
||||
pdo->has_voices = true;
|
||||
pdo->voices = 1;
|
||||
pdo->voices = pdo->mixing_engine ? 1 : INT_MAX;
|
||||
}
|
||||
if (!pdo->has_format) {
|
||||
pdo->has_format = true;
|
||||
|
@ -78,13 +78,17 @@ static void glue (audio_pcm_hw_free_resources_, TYPE) (HW *hw)
|
||||
|
||||
static void glue(audio_pcm_hw_alloc_resources_, TYPE)(HW *hw)
|
||||
{
|
||||
size_t samples = hw->samples;
|
||||
if (audio_bug(__func__, samples == 0)) {
|
||||
dolog("Attempted to allocate empty buffer\n");
|
||||
}
|
||||
if (glue(audio_get_pdo_, TYPE)(hw->s->dev)->mixing_engine) {
|
||||
size_t samples = hw->samples;
|
||||
if (audio_bug(__func__, samples == 0)) {
|
||||
dolog("Attempted to allocate empty buffer\n");
|
||||
}
|
||||
|
||||
HWBUF = g_malloc0(sizeof(STSampleBuffer) + sizeof(st_sample) * samples);
|
||||
HWBUF->size = samples;
|
||||
HWBUF = g_malloc0(sizeof(STSampleBuffer) + sizeof(st_sample) * samples);
|
||||
HWBUF->size = samples;
|
||||
} else {
|
||||
HWBUF = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void glue (audio_pcm_sw_free_resources_, TYPE) (SW *sw)
|
||||
@ -103,6 +107,10 @@ static int glue (audio_pcm_sw_alloc_resources_, TYPE) (SW *sw)
|
||||
{
|
||||
int samples;
|
||||
|
||||
if (!glue(audio_get_pdo_, TYPE)(sw->s->dev)->mixing_engine) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
samples = ((int64_t) sw->HWBUF->size << 32) / sw->ratio;
|
||||
|
||||
sw->buf = audio_calloc(__func__, samples, sizeof(struct st_sample));
|
||||
@ -328,9 +336,9 @@ static HW *glue(audio_pcm_hw_add_, TYPE)(AudioState *s, struct audsettings *as)
|
||||
HW *hw;
|
||||
AudiodevPerDirectionOptions *pdo = glue(audio_get_pdo_, TYPE)(s->dev);
|
||||
|
||||
if (pdo->fixed_settings) {
|
||||
if (!pdo->mixing_engine || pdo->fixed_settings) {
|
||||
hw = glue(audio_pcm_hw_add_new_, TYPE)(s, as);
|
||||
if (hw) {
|
||||
if (!pdo->mixing_engine || hw) {
|
||||
return hw;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user