Remove glob_audio_state from functions, where possible without breaking
the API. This means that most static functions in audio.c now take an
AudioState pointer instead of implicitly using glob_audio_state. Also
included a pointer in SWVoice*, HWVoice* structs, so that functions
dealing them can know the audio state without having to pass it around
separately.
This is required in order to support multiple simultaneous audio
backends (added in a later commit).
Signed-off-by: Kővágó, Zoltán <DirtY.iCE.hu@gmail.com>
---
audio/audio_int.h | 7 +++++
audio/audio_template.h | 46 ++++++++++++++++----------------
audio/audio.c | 59 +++++++++++++++++++-----------------------
3 files changed, 56 insertions(+), 56 deletions(-)
diff --git a/audio/audio_int.h b/audio/audio_int.h
index 66214199f0..2a7556d113 100644
--- a/audio/audio_int.h
+++ b/audio/audio_int.h
@@ -52,6 +52,7 @@ struct audio_pcm_info {
typedef struct SWVoiceCap SWVoiceCap;
typedef struct HWVoiceOut {
+ AudioState *s;
int enabled;
int poll_mode;
int pending_disable;
@@ -73,6 +74,7 @@ typedef struct HWVoiceOut {
} HWVoiceOut;
typedef struct HWVoiceIn {
+ AudioState *s;
int enabled;
int poll_mode;
struct audio_pcm_info info;
@@ -94,6 +96,7 @@ typedef struct HWVoiceIn {
struct SWVoiceOut {
QEMUSoundCard *card;
+ AudioState *s;
struct audio_pcm_info info;
t_sample *conv;
int64_t ratio;
@@ -111,6 +114,7 @@ struct SWVoiceOut {
struct SWVoiceIn {
QEMUSoundCard *card;
+ AudioState *s;
int active;
struct audio_pcm_info info;
int64_t ratio;
@@ -188,6 +192,9 @@ struct AudioState {
int nb_hw_voices_in;
int vm_running;
int64_t period_ticks;
+
+ bool timer_running;
+ uint64_t timer_last;
};
extern const struct mixeng_volume nominal_volume;
diff --git a/audio/audio_template.h b/audio/audio_template.h
index c1d7207abd..ccf6d810f7 100644
--- a/audio/audio_template.h
+++ b/audio/audio_template.h
@@ -36,9 +36,9 @@
#define HWBUF hw->conv_buf
#endif
-static void glue (audio_init_nb_voices_, TYPE) (struct audio_driver *drv)
+static void glue(audio_init_nb_voices_, TYPE)(AudioState *s,
+ struct audio_driver *drv)
{
- AudioState *s = &glob_audio_state;
int max_voices = glue (drv->max_voices_, TYPE);
int voice_size = glue (drv->voice_size_, TYPE);
@@ -183,8 +183,8 @@ static void glue (audio_pcm_hw_del_sw_, TYPE) (SW *sw)
static void glue (audio_pcm_hw_gc_, TYPE) (HW **hwp)
{
- AudioState *s = &glob_audio_state;
HW *hw = *hwp;
+ AudioState *s = hw->s;
if (!hw->sw_head.lh_first) {
#ifdef DAC
@@ -199,15 +199,14 @@ static void glue (audio_pcm_hw_gc_, TYPE) (HW **hwp)
}
}
-static HW *glue (audio_pcm_hw_find_any_, TYPE) (HW *hw)
+static HW *glue(audio_pcm_hw_find_any_, TYPE)(AudioState *s, HW *hw)
{
- AudioState *s = &glob_audio_state;
return hw ? hw->entries.le_next : glue (s->hw_head_, TYPE).lh_first;
}
-static HW *glue (audio_pcm_hw_find_any_enabled_, TYPE) (HW *hw)
+static HW *glue(audio_pcm_hw_find_any_enabled_, TYPE)(AudioState *s, HW *hw)
{
- while ((hw = glue (audio_pcm_hw_find_any_, TYPE) (hw))) {
+ while ((hw = glue(audio_pcm_hw_find_any_, TYPE)(s, hw))) {
if (hw->enabled) {
return hw;
}
@@ -215,12 +214,10 @@ static HW *glue (audio_pcm_hw_find_any_enabled_, TYPE) (HW *hw)
return NULL;
}
-static HW *glue (audio_pcm_hw_find_specific_, TYPE) (
- HW *hw,
- struct audsettings *as
- )
+static HW *glue(audio_pcm_hw_find_specific_, TYPE)(AudioState *s, HW *hw,
+ struct audsettings *as)
{
- while ((hw = glue (audio_pcm_hw_find_any_, TYPE) (hw))) {
+ while ((hw = glue(audio_pcm_hw_find_any_, TYPE)(s, hw))) {
if (audio_pcm_info_eq (&hw->info, as)) {
return hw;
}
@@ -228,10 +225,10 @@ static HW *glue (audio_pcm_hw_find_specific_, TYPE) (
return NULL;
}
-static HW *glue (audio_pcm_hw_add_new_, TYPE) (struct audsettings *as)
+static HW *glue(audio_pcm_hw_add_new_, TYPE)(AudioState *s,
+ struct audsettings *as)
{
HW *hw;
- AudioState *s = &glob_audio_state;
struct audio_driver *drv = s->drv;
if (!glue (s->nb_hw_voices_, TYPE)) {
@@ -255,6 +252,7 @@ static HW *glue (audio_pcm_hw_add_new_, TYPE) (struct audsettings *as)
return NULL;
}
+ hw->s = s;
hw->pcm_ops = drv->pcm_ops;
hw->ctl_caps = drv->ctl_caps;
@@ -299,33 +297,33 @@ static HW *glue (audio_pcm_hw_add_new_, TYPE) (struct audsettings *as)
return NULL;
}
-static HW *glue (audio_pcm_hw_add_, TYPE) (struct audsettings *as)
+static HW *glue(audio_pcm_hw_add_, TYPE)(AudioState *s, struct audsettings *as)
{
HW *hw;
- AudioState *s = &glob_audio_state;
AudiodevPerDirectionOptions *pdo = s->dev->TYPE;
if (pdo->fixed_settings) {
- hw = glue (audio_pcm_hw_add_new_, TYPE) (as);
+ hw = glue(audio_pcm_hw_add_new_, TYPE)(s, as);
if (hw) {
return hw;
}
}
- hw = glue (audio_pcm_hw_find_specific_, TYPE) (NULL, as);
+ hw = glue(audio_pcm_hw_find_specific_, TYPE)(s, NULL, as);
if (hw) {
return hw;
}
- hw = glue (audio_pcm_hw_add_new_, TYPE) (as);
+ hw = glue(audio_pcm_hw_add_new_, TYPE)(s, as);
if (hw) {
return hw;
}
- return glue (audio_pcm_hw_find_any_, TYPE) (NULL);
+ return glue(audio_pcm_hw_find_any_, TYPE)(s, NULL);
}
-static SW *glue (audio_pcm_create_voice_pair_, TYPE) (
+static SW *glue(audio_pcm_create_voice_pair_, TYPE)(
+ AudioState *s,
const char *sw_name,
struct audsettings *as
)
@@ -333,7 +331,6 @@ static SW *glue (audio_pcm_create_voice_pair_, TYPE) (
SW *sw;
HW *hw;
struct audsettings hw_as;
- AudioState *s = &glob_audio_state;
AudiodevPerDirectionOptions *pdo = s->dev->TYPE;
if (pdo->fixed_settings) {
@@ -349,8 +346,9 @@ static SW *glue (audio_pcm_create_voice_pair_, TYPE) (
sw_name ? sw_name : "unknown", sizeof (*sw));
goto err1;
}
+ sw->s = s;
- hw = glue (audio_pcm_hw_add_, TYPE) (&hw_as);
+ hw = glue(audio_pcm_hw_add_, TYPE)(s, &hw_as);
if (!hw) {
goto err2;
}
@@ -447,7 +445,7 @@ SW *glue (AUD_open_, TYPE) (
}
}
else {
- sw = glue (audio_pcm_create_voice_pair_, TYPE) (name, as);
+ sw = glue(audio_pcm_create_voice_pair_, TYPE)(s, name, as);
if (!sw) {
dolog ("Failed to create voice `%s'\n", name);
return NULL;
diff --git a/audio/audio.c b/audio/audio.c
index 77bd8386d0..ef8ce3b91d 100644
--- a/audio/audio.c
+++ b/audio/audio.c
@@ -397,12 +397,10 @@ static void noop_conv (struct st_sample *dst, const void *src, int samples)
(void) samples;
}
-static CaptureVoiceOut *audio_pcm_capture_find_specific (
- struct audsettings *as
- )
+static CaptureVoiceOut *audio_pcm_capture_find_specific(AudioState *s,
+ struct audsettings *as)
{
CaptureVoiceOut *cap;
- AudioState *s = &glob_audio_state;
for (cap = s->cap_head.lh_first; cap; cap = cap->entries.le_next) {
if (audio_pcm_info_eq (&cap->hw.info, as)) {
@@ -479,7 +477,7 @@ static void audio_detach_capture (HWVoiceOut *hw)
static int audio_attach_capture (HWVoiceOut *hw)
{
- AudioState *s = &glob_audio_state;
+ AudioState *s = hw->s;
CaptureVoiceOut *cap;
audio_detach_capture (hw);
@@ -792,19 +790,15 @@ static void audio_pcm_print_info (const char *cap, struct audio_pcm_info *info)
/*
* Timer
*/
-
-static bool audio_timer_running;
-static uint64_t audio_timer_last;
-
-static int audio_is_timer_needed (void)
+static int audio_is_timer_needed(AudioState *s)
{
HWVoiceIn *hwi = NULL;
HWVoiceOut *hwo = NULL;
- while ((hwo = audio_pcm_hw_find_any_enabled_out (hwo))) {
+ while ((hwo = audio_pcm_hw_find_any_enabled_out(s, hwo))) {
if (!hwo->poll_mode) return 1;
}
- while ((hwi = audio_pcm_hw_find_any_enabled_in (hwi))) {
+ while ((hwi = audio_pcm_hw_find_any_enabled_in(s, hwi))) {
if (!hwi->poll_mode) return 1;
}
return 0;
@@ -812,18 +806,18 @@ static int audio_is_timer_needed (void)
static void audio_reset_timer (AudioState *s)
{
- if (audio_is_timer_needed ()) {
+ if (audio_is_timer_needed(s)) {
timer_mod_anticipate_ns(s->ts,
qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + s->period_ticks);
- if (!audio_timer_running) {
- audio_timer_running = true;
- audio_timer_last = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
+ if (!s->timer_running) {
+ s->timer_running = true;
+ s->timer_last = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
trace_audio_timer_start(s->period_ticks / SCALE_MS);
}
} else {
timer_del(s->ts);
- if (audio_timer_running) {
- audio_timer_running = false;
+ if (s->timer_running) {
+ s->timer_running = false;
trace_audio_timer_stop();
}
}
@@ -835,11 +829,11 @@ static void audio_timer (void *opaque)
AudioState *s = opaque;
now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
- diff = now - audio_timer_last;
+ diff = now - s->timer_last;
if (diff > s->period_ticks * 3 / 2) {
trace_audio_timer_delayed(diff / SCALE_MS);
}
- audio_timer_last = now;
+ s->timer_last = now;
audio_run("timer");
audio_reset_timer(s);
@@ -893,7 +887,7 @@ void AUD_set_active_out (SWVoiceOut *sw, int on)
hw = sw->hw;
if (sw->active != on) {
- AudioState *s = &glob_audio_state;
+ AudioState *s = sw->s;
SWVoiceOut *temp_sw;
SWVoiceCap *sc;
@@ -940,7 +934,7 @@ void AUD_set_active_in (SWVoiceIn *sw, int on)
hw = sw->hw;
if (sw->active != on) {
- AudioState *s = &glob_audio_state;
+ AudioState *s = sw->s;
SWVoiceIn *temp_sw;
if (on) {
@@ -1063,7 +1057,7 @@ static void audio_run_out (AudioState *s)
HWVoiceOut *hw = NULL;
SWVoiceOut *sw;
- while ((hw = audio_pcm_hw_find_any_enabled_out (hw))) {
+ while ((hw = audio_pcm_hw_find_any_enabled_out(s, hw))) {
int played;
int live, free, nb_live, cleanup_required, prev_rpos;
@@ -1168,7 +1162,7 @@ static void audio_run_in (AudioState *s)
{
HWVoiceIn *hw = NULL;
- while ((hw = audio_pcm_hw_find_any_enabled_in (hw))) {
+ while ((hw = audio_pcm_hw_find_any_enabled_in(s, hw))) {
SWVoiceIn *sw;
int captured = 0, min;
@@ -1274,8 +1268,8 @@ static int audio_driver_init(AudioState *s, struct audio_driver *drv,
s->drv_opaque = drv->init(dev);
if (s->drv_opaque) {
- audio_init_nb_voices_out (drv);
- audio_init_nb_voices_in (drv);
+ audio_init_nb_voices_out(s, drv);
+ audio_init_nb_voices_in(s, drv);
s->drv = drv;
return 0;
}
@@ -1294,11 +1288,11 @@ static void audio_vm_change_state_handler (void *opaque, int running,
int op = running ? VOICE_ENABLE : VOICE_DISABLE;
s->vm_running = running;
- while ((hwo = audio_pcm_hw_find_any_enabled_out (hwo))) {
+ while ((hwo = audio_pcm_hw_find_any_enabled_out(s, hwo))) {
hwo->pcm_ops->ctl_out(hwo, op);
}
- while ((hwi = audio_pcm_hw_find_any_enabled_in (hwi))) {
+ while ((hwi = audio_pcm_hw_find_any_enabled_in(s, hwi))) {
hwi->pcm_ops->ctl_in(hwi, op);
}
audio_reset_timer (s);
@@ -1318,7 +1312,7 @@ void audio_cleanup(void)
HWVoiceIn *hwi, *hwin;
is_cleaning_up = true;
- QLIST_FOREACH_SAFE(hwo, &glob_audio_state.hw_head_out, entries, hwon) {
+ QLIST_FOREACH_SAFE(hwo, &s->hw_head_out, entries, hwon) {
SWVoiceCap *sc;
if (hwo->enabled) {
@@ -1337,7 +1331,7 @@ void audio_cleanup(void)
QLIST_REMOVE(hwo, entries);
}
- QLIST_FOREACH_SAFE(hwi, &glob_audio_state.hw_head_in, entries, hwin) {
+ QLIST_FOREACH_SAFE(hwi, &s->hw_head_in, entries, hwin) {
if (hwi->enabled) {
hwi->pcm_ops->ctl_in (hwi, VOICE_DISABLE);
}
@@ -1537,7 +1531,7 @@ CaptureVoiceOut *AUD_add_capture (
cb->ops = *ops;
cb->opaque = cb_opaque;
- cap = audio_pcm_capture_find_specific (as);
+ cap = audio_pcm_capture_find_specific(s, as);
if (cap) {
QLIST_INSERT_HEAD (&cap->cb_head, cb, entries);
return cap;
@@ -1554,6 +1548,7 @@ CaptureVoiceOut *AUD_add_capture (
}
hw = &cap->hw;
+ hw->s = s;
QLIST_INIT (&hw->sw_head);
QLIST_INIT (&cap->cb_head);
@@ -1586,7 +1581,7 @@ CaptureVoiceOut *AUD_add_capture (
QLIST_INSERT_HEAD (&s->cap_head, cap, entries);
QLIST_INSERT_HEAD (&cap->cb_head, cb, entries);
- QLIST_FOREACH(hw, &glob_audio_state.hw_head_out, entries) {
+ QLIST_FOREACH(hw, &s->hw_head_out, entries) {
audio_attach_capture (hw);
}
return cap;
--
2.20.1
On Thu, Jan 17, 2019 at 12:36:48AM +0100, Kővágó, Zoltán wrote:
> Remove glob_audio_state from functions, where possible without breaking
> the API. This means that most static functions in audio.c now take an
> AudioState pointer instead of implicitly using glob_audio_state. Also
> included a pointer in SWVoice*, HWVoice* structs, so that functions
> dealing them can know the audio state without having to pass it around
> separately.
>
> This is required in order to support multiple simultaneous audio
> backends (added in a later commit).
I think it makes sense to split the series into smaller pieces, here
would be a good place for the split (i.e. patches 1-14 which introduce
-audiodev will be the first batch, this patch starts the next batch).
>
> Signed-off-by: Kővágó, Zoltán <DirtY.iCE.hu@gmail.com>
> ---
> audio/audio_int.h | 7 +++++
> audio/audio_template.h | 46 ++++++++++++++++----------------
> audio/audio.c | 59 +++++++++++++++++++-----------------------
> 3 files changed, 56 insertions(+), 56 deletions(-)
>
> diff --git a/audio/audio_int.h b/audio/audio_int.h
> index 66214199f0..2a7556d113 100644
> --- a/audio/audio_int.h
> +++ b/audio/audio_int.h
> @@ -52,6 +52,7 @@ struct audio_pcm_info {
> typedef struct SWVoiceCap SWVoiceCap;
>
> typedef struct HWVoiceOut {
> + AudioState *s;
> int enabled;
> int poll_mode;
> int pending_disable;
> @@ -73,6 +74,7 @@ typedef struct HWVoiceOut {
> } HWVoiceOut;
>
> typedef struct HWVoiceIn {
> + AudioState *s;
> int enabled;
> int poll_mode;
> struct audio_pcm_info info;
> @@ -94,6 +96,7 @@ typedef struct HWVoiceIn {
>
> struct SWVoiceOut {
> QEMUSoundCard *card;
> + AudioState *s;
> struct audio_pcm_info info;
> t_sample *conv;
> int64_t ratio;
> @@ -111,6 +114,7 @@ struct SWVoiceOut {
>
> struct SWVoiceIn {
> QEMUSoundCard *card;
> + AudioState *s;
> int active;
> struct audio_pcm_info info;
> int64_t ratio;
> @@ -188,6 +192,9 @@ struct AudioState {
> int nb_hw_voices_in;
> int vm_running;
> int64_t period_ticks;
> +
> + bool timer_running;
> + uint64_t timer_last;
> };
>
> extern const struct mixeng_volume nominal_volume;
> diff --git a/audio/audio_template.h b/audio/audio_template.h
> index c1d7207abd..ccf6d810f7 100644
> --- a/audio/audio_template.h
> +++ b/audio/audio_template.h
> @@ -36,9 +36,9 @@
> #define HWBUF hw->conv_buf
> #endif
>
> -static void glue (audio_init_nb_voices_, TYPE) (struct audio_driver *drv)
> +static void glue(audio_init_nb_voices_, TYPE)(AudioState *s,
> + struct audio_driver *drv)
> {
> - AudioState *s = &glob_audio_state;
> int max_voices = glue (drv->max_voices_, TYPE);
> int voice_size = glue (drv->voice_size_, TYPE);
>
> @@ -183,8 +183,8 @@ static void glue (audio_pcm_hw_del_sw_, TYPE) (SW *sw)
>
> static void glue (audio_pcm_hw_gc_, TYPE) (HW **hwp)
> {
> - AudioState *s = &glob_audio_state;
> HW *hw = *hwp;
> + AudioState *s = hw->s;
>
> if (!hw->sw_head.lh_first) {
> #ifdef DAC
> @@ -199,15 +199,14 @@ static void glue (audio_pcm_hw_gc_, TYPE) (HW **hwp)
> }
> }
>
> -static HW *glue (audio_pcm_hw_find_any_, TYPE) (HW *hw)
> +static HW *glue(audio_pcm_hw_find_any_, TYPE)(AudioState *s, HW *hw)
> {
> - AudioState *s = &glob_audio_state;
> return hw ? hw->entries.le_next : glue (s->hw_head_, TYPE).lh_first;
> }
>
> -static HW *glue (audio_pcm_hw_find_any_enabled_, TYPE) (HW *hw)
> +static HW *glue(audio_pcm_hw_find_any_enabled_, TYPE)(AudioState *s, HW *hw)
> {
> - while ((hw = glue (audio_pcm_hw_find_any_, TYPE) (hw))) {
> + while ((hw = glue(audio_pcm_hw_find_any_, TYPE)(s, hw))) {
> if (hw->enabled) {
> return hw;
> }
> @@ -215,12 +214,10 @@ static HW *glue (audio_pcm_hw_find_any_enabled_, TYPE) (HW *hw)
> return NULL;
> }
>
> -static HW *glue (audio_pcm_hw_find_specific_, TYPE) (
> - HW *hw,
> - struct audsettings *as
> - )
> +static HW *glue(audio_pcm_hw_find_specific_, TYPE)(AudioState *s, HW *hw,
> + struct audsettings *as)
> {
> - while ((hw = glue (audio_pcm_hw_find_any_, TYPE) (hw))) {
> + while ((hw = glue(audio_pcm_hw_find_any_, TYPE)(s, hw))) {
> if (audio_pcm_info_eq (&hw->info, as)) {
> return hw;
> }
> @@ -228,10 +225,10 @@ static HW *glue (audio_pcm_hw_find_specific_, TYPE) (
> return NULL;
> }
>
> -static HW *glue (audio_pcm_hw_add_new_, TYPE) (struct audsettings *as)
> +static HW *glue(audio_pcm_hw_add_new_, TYPE)(AudioState *s,
> + struct audsettings *as)
> {
> HW *hw;
> - AudioState *s = &glob_audio_state;
> struct audio_driver *drv = s->drv;
>
> if (!glue (s->nb_hw_voices_, TYPE)) {
> @@ -255,6 +252,7 @@ static HW *glue (audio_pcm_hw_add_new_, TYPE) (struct audsettings *as)
> return NULL;
> }
>
> + hw->s = s;
> hw->pcm_ops = drv->pcm_ops;
> hw->ctl_caps = drv->ctl_caps;
>
> @@ -299,33 +297,33 @@ static HW *glue (audio_pcm_hw_add_new_, TYPE) (struct audsettings *as)
> return NULL;
> }
>
> -static HW *glue (audio_pcm_hw_add_, TYPE) (struct audsettings *as)
> +static HW *glue(audio_pcm_hw_add_, TYPE)(AudioState *s, struct audsettings *as)
> {
> HW *hw;
> - AudioState *s = &glob_audio_state;
> AudiodevPerDirectionOptions *pdo = s->dev->TYPE;
>
> if (pdo->fixed_settings) {
> - hw = glue (audio_pcm_hw_add_new_, TYPE) (as);
> + hw = glue(audio_pcm_hw_add_new_, TYPE)(s, as);
> if (hw) {
> return hw;
> }
> }
>
> - hw = glue (audio_pcm_hw_find_specific_, TYPE) (NULL, as);
> + hw = glue(audio_pcm_hw_find_specific_, TYPE)(s, NULL, as);
> if (hw) {
> return hw;
> }
>
> - hw = glue (audio_pcm_hw_add_new_, TYPE) (as);
> + hw = glue(audio_pcm_hw_add_new_, TYPE)(s, as);
> if (hw) {
> return hw;
> }
>
> - return glue (audio_pcm_hw_find_any_, TYPE) (NULL);
> + return glue(audio_pcm_hw_find_any_, TYPE)(s, NULL);
> }
>
> -static SW *glue (audio_pcm_create_voice_pair_, TYPE) (
> +static SW *glue(audio_pcm_create_voice_pair_, TYPE)(
> + AudioState *s,
> const char *sw_name,
> struct audsettings *as
> )
> @@ -333,7 +331,6 @@ static SW *glue (audio_pcm_create_voice_pair_, TYPE) (
> SW *sw;
> HW *hw;
> struct audsettings hw_as;
> - AudioState *s = &glob_audio_state;
> AudiodevPerDirectionOptions *pdo = s->dev->TYPE;
>
> if (pdo->fixed_settings) {
> @@ -349,8 +346,9 @@ static SW *glue (audio_pcm_create_voice_pair_, TYPE) (
> sw_name ? sw_name : "unknown", sizeof (*sw));
> goto err1;
> }
> + sw->s = s;
>
> - hw = glue (audio_pcm_hw_add_, TYPE) (&hw_as);
> + hw = glue(audio_pcm_hw_add_, TYPE)(s, &hw_as);
> if (!hw) {
> goto err2;
> }
> @@ -447,7 +445,7 @@ SW *glue (AUD_open_, TYPE) (
> }
> }
> else {
> - sw = glue (audio_pcm_create_voice_pair_, TYPE) (name, as);
> + sw = glue(audio_pcm_create_voice_pair_, TYPE)(s, name, as);
> if (!sw) {
> dolog ("Failed to create voice `%s'\n", name);
> return NULL;
> diff --git a/audio/audio.c b/audio/audio.c
> index 77bd8386d0..ef8ce3b91d 100644
> --- a/audio/audio.c
> +++ b/audio/audio.c
> @@ -397,12 +397,10 @@ static void noop_conv (struct st_sample *dst, const void *src, int samples)
> (void) samples;
> }
>
> -static CaptureVoiceOut *audio_pcm_capture_find_specific (
> - struct audsettings *as
> - )
> +static CaptureVoiceOut *audio_pcm_capture_find_specific(AudioState *s,
> + struct audsettings *as)
> {
> CaptureVoiceOut *cap;
> - AudioState *s = &glob_audio_state;
>
> for (cap = s->cap_head.lh_first; cap; cap = cap->entries.le_next) {
> if (audio_pcm_info_eq (&cap->hw.info, as)) {
> @@ -479,7 +477,7 @@ static void audio_detach_capture (HWVoiceOut *hw)
>
> static int audio_attach_capture (HWVoiceOut *hw)
> {
> - AudioState *s = &glob_audio_state;
> + AudioState *s = hw->s;
> CaptureVoiceOut *cap;
>
> audio_detach_capture (hw);
> @@ -792,19 +790,15 @@ static void audio_pcm_print_info (const char *cap, struct audio_pcm_info *info)
> /*
> * Timer
> */
> -
> -static bool audio_timer_running;
> -static uint64_t audio_timer_last;
> -
> -static int audio_is_timer_needed (void)
> +static int audio_is_timer_needed(AudioState *s)
> {
> HWVoiceIn *hwi = NULL;
> HWVoiceOut *hwo = NULL;
>
> - while ((hwo = audio_pcm_hw_find_any_enabled_out (hwo))) {
> + while ((hwo = audio_pcm_hw_find_any_enabled_out(s, hwo))) {
> if (!hwo->poll_mode) return 1;
> }
> - while ((hwi = audio_pcm_hw_find_any_enabled_in (hwi))) {
> + while ((hwi = audio_pcm_hw_find_any_enabled_in(s, hwi))) {
> if (!hwi->poll_mode) return 1;
> }
> return 0;
> @@ -812,18 +806,18 @@ static int audio_is_timer_needed (void)
>
> static void audio_reset_timer (AudioState *s)
> {
> - if (audio_is_timer_needed ()) {
> + if (audio_is_timer_needed(s)) {
> timer_mod_anticipate_ns(s->ts,
> qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + s->period_ticks);
> - if (!audio_timer_running) {
> - audio_timer_running = true;
> - audio_timer_last = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
> + if (!s->timer_running) {
> + s->timer_running = true;
> + s->timer_last = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
> trace_audio_timer_start(s->period_ticks / SCALE_MS);
> }
> } else {
> timer_del(s->ts);
> - if (audio_timer_running) {
> - audio_timer_running = false;
> + if (s->timer_running) {
> + s->timer_running = false;
> trace_audio_timer_stop();
> }
> }
> @@ -835,11 +829,11 @@ static void audio_timer (void *opaque)
> AudioState *s = opaque;
>
> now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
> - diff = now - audio_timer_last;
> + diff = now - s->timer_last;
> if (diff > s->period_ticks * 3 / 2) {
> trace_audio_timer_delayed(diff / SCALE_MS);
> }
> - audio_timer_last = now;
> + s->timer_last = now;
>
> audio_run("timer");
> audio_reset_timer(s);
> @@ -893,7 +887,7 @@ void AUD_set_active_out (SWVoiceOut *sw, int on)
>
> hw = sw->hw;
> if (sw->active != on) {
> - AudioState *s = &glob_audio_state;
> + AudioState *s = sw->s;
> SWVoiceOut *temp_sw;
> SWVoiceCap *sc;
>
> @@ -940,7 +934,7 @@ void AUD_set_active_in (SWVoiceIn *sw, int on)
>
> hw = sw->hw;
> if (sw->active != on) {
> - AudioState *s = &glob_audio_state;
> + AudioState *s = sw->s;
> SWVoiceIn *temp_sw;
>
> if (on) {
> @@ -1063,7 +1057,7 @@ static void audio_run_out (AudioState *s)
> HWVoiceOut *hw = NULL;
> SWVoiceOut *sw;
>
> - while ((hw = audio_pcm_hw_find_any_enabled_out (hw))) {
> + while ((hw = audio_pcm_hw_find_any_enabled_out(s, hw))) {
> int played;
> int live, free, nb_live, cleanup_required, prev_rpos;
>
> @@ -1168,7 +1162,7 @@ static void audio_run_in (AudioState *s)
> {
> HWVoiceIn *hw = NULL;
>
> - while ((hw = audio_pcm_hw_find_any_enabled_in (hw))) {
> + while ((hw = audio_pcm_hw_find_any_enabled_in(s, hw))) {
> SWVoiceIn *sw;
> int captured = 0, min;
>
> @@ -1274,8 +1268,8 @@ static int audio_driver_init(AudioState *s, struct audio_driver *drv,
> s->drv_opaque = drv->init(dev);
>
> if (s->drv_opaque) {
> - audio_init_nb_voices_out (drv);
> - audio_init_nb_voices_in (drv);
> + audio_init_nb_voices_out(s, drv);
> + audio_init_nb_voices_in(s, drv);
> s->drv = drv;
> return 0;
> }
> @@ -1294,11 +1288,11 @@ static void audio_vm_change_state_handler (void *opaque, int running,
> int op = running ? VOICE_ENABLE : VOICE_DISABLE;
>
> s->vm_running = running;
> - while ((hwo = audio_pcm_hw_find_any_enabled_out (hwo))) {
> + while ((hwo = audio_pcm_hw_find_any_enabled_out(s, hwo))) {
> hwo->pcm_ops->ctl_out(hwo, op);
> }
>
> - while ((hwi = audio_pcm_hw_find_any_enabled_in (hwi))) {
> + while ((hwi = audio_pcm_hw_find_any_enabled_in(s, hwi))) {
> hwi->pcm_ops->ctl_in(hwi, op);
> }
> audio_reset_timer (s);
> @@ -1318,7 +1312,7 @@ void audio_cleanup(void)
> HWVoiceIn *hwi, *hwin;
>
> is_cleaning_up = true;
> - QLIST_FOREACH_SAFE(hwo, &glob_audio_state.hw_head_out, entries, hwon) {
> + QLIST_FOREACH_SAFE(hwo, &s->hw_head_out, entries, hwon) {
> SWVoiceCap *sc;
>
> if (hwo->enabled) {
> @@ -1337,7 +1331,7 @@ void audio_cleanup(void)
> QLIST_REMOVE(hwo, entries);
> }
>
> - QLIST_FOREACH_SAFE(hwi, &glob_audio_state.hw_head_in, entries, hwin) {
> + QLIST_FOREACH_SAFE(hwi, &s->hw_head_in, entries, hwin) {
> if (hwi->enabled) {
> hwi->pcm_ops->ctl_in (hwi, VOICE_DISABLE);
> }
> @@ -1537,7 +1531,7 @@ CaptureVoiceOut *AUD_add_capture (
> cb->ops = *ops;
> cb->opaque = cb_opaque;
>
> - cap = audio_pcm_capture_find_specific (as);
> + cap = audio_pcm_capture_find_specific(s, as);
> if (cap) {
> QLIST_INSERT_HEAD (&cap->cb_head, cb, entries);
> return cap;
> @@ -1554,6 +1548,7 @@ CaptureVoiceOut *AUD_add_capture (
> }
>
> hw = &cap->hw;
> + hw->s = s;
> QLIST_INIT (&hw->sw_head);
> QLIST_INIT (&cap->cb_head);
>
> @@ -1586,7 +1581,7 @@ CaptureVoiceOut *AUD_add_capture (
> QLIST_INSERT_HEAD (&s->cap_head, cap, entries);
> QLIST_INSERT_HEAD (&cap->cb_head, cb, entries);
>
> - QLIST_FOREACH(hw, &glob_audio_state.hw_head_out, entries) {
> + QLIST_FOREACH(hw, &s->hw_head_out, entries) {
> audio_attach_capture (hw);
> }
> return cap;
> --
> 2.20.1
>
On 2019-01-17 10:22, Gerd Hoffmann wrote:
> On Thu, Jan 17, 2019 at 12:36:48AM +0100, Kővágó, Zoltán wrote:
>> Remove glob_audio_state from functions, where possible without breaking
>> the API. This means that most static functions in audio.c now take an
>> AudioState pointer instead of implicitly using glob_audio_state. Also
>> included a pointer in SWVoice*, HWVoice* structs, so that functions
>> dealing them can know the audio state without having to pass it around
>> separately.
>>
>> This is required in order to support multiple simultaneous audio
>> backends (added in a later commit).
>
> I think it makes sense to split the series into smaller pieces, here
> would be a good place for the split (i.e. patches 1-14 which introduce
> -audiodev will be the first batch, this patch starts the next batch).
Alright, I think this series is pretty useless without at least the
multiple simultaneous backends part, but if it's easier to review in
smaller chunks, let's do it.
>
>>
>> Signed-off-by: Kővágó, Zoltán <DirtY.iCE.hu@gmail.com>
>> ---
>> audio/audio_int.h | 7 +++++
>> audio/audio_template.h | 46 ++++++++++++++++----------------
>> audio/audio.c | 59 +++++++++++++++++++-----------------------
>> 3 files changed, 56 insertions(+), 56 deletions(-)
>>
>> diff --git a/audio/audio_int.h b/audio/audio_int.h
>> index 66214199f0..2a7556d113 100644
>> --- a/audio/audio_int.h
>> +++ b/audio/audio_int.h
>> @@ -52,6 +52,7 @@ struct audio_pcm_info {
>> typedef struct SWVoiceCap SWVoiceCap;
>>
>> typedef struct HWVoiceOut {
>> + AudioState *s;
>> int enabled;
>> int poll_mode;
>> int pending_disable;
>> @@ -73,6 +74,7 @@ typedef struct HWVoiceOut {
>> } HWVoiceOut;
>>
>> typedef struct HWVoiceIn {
>> + AudioState *s;
>> int enabled;
>> int poll_mode;
>> struct audio_pcm_info info;
>> @@ -94,6 +96,7 @@ typedef struct HWVoiceIn {
>>
>> struct SWVoiceOut {
>> QEMUSoundCard *card;
>> + AudioState *s;
>> struct audio_pcm_info info;
>> t_sample *conv;
>> int64_t ratio;
>> @@ -111,6 +114,7 @@ struct SWVoiceOut {
>>
>> struct SWVoiceIn {
>> QEMUSoundCard *card;
>> + AudioState *s;
>> int active;
>> struct audio_pcm_info info;
>> int64_t ratio;
>> @@ -188,6 +192,9 @@ struct AudioState {
>> int nb_hw_voices_in;
>> int vm_running;
>> int64_t period_ticks;
>> +
>> + bool timer_running;
>> + uint64_t timer_last;
>> };
>>
>> extern const struct mixeng_volume nominal_volume;
>> diff --git a/audio/audio_template.h b/audio/audio_template.h
>> index c1d7207abd..ccf6d810f7 100644
>> --- a/audio/audio_template.h
>> +++ b/audio/audio_template.h
>> @@ -36,9 +36,9 @@
>> #define HWBUF hw->conv_buf
>> #endif
>>
>> -static void glue (audio_init_nb_voices_, TYPE) (struct audio_driver *drv)
>> +static void glue(audio_init_nb_voices_, TYPE)(AudioState *s,
>> + struct audio_driver *drv)
>> {
>> - AudioState *s = &glob_audio_state;
>> int max_voices = glue (drv->max_voices_, TYPE);
>> int voice_size = glue (drv->voice_size_, TYPE);
>>
>> @@ -183,8 +183,8 @@ static void glue (audio_pcm_hw_del_sw_, TYPE) (SW *sw)
>>
>> static void glue (audio_pcm_hw_gc_, TYPE) (HW **hwp)
>> {
>> - AudioState *s = &glob_audio_state;
>> HW *hw = *hwp;
>> + AudioState *s = hw->s;
>>
>> if (!hw->sw_head.lh_first) {
>> #ifdef DAC
>> @@ -199,15 +199,14 @@ static void glue (audio_pcm_hw_gc_, TYPE) (HW **hwp)
>> }
>> }
>>
>> -static HW *glue (audio_pcm_hw_find_any_, TYPE) (HW *hw)
>> +static HW *glue(audio_pcm_hw_find_any_, TYPE)(AudioState *s, HW *hw)
>> {
>> - AudioState *s = &glob_audio_state;
>> return hw ? hw->entries.le_next : glue (s->hw_head_, TYPE).lh_first;
>> }
>>
>> -static HW *glue (audio_pcm_hw_find_any_enabled_, TYPE) (HW *hw)
>> +static HW *glue(audio_pcm_hw_find_any_enabled_, TYPE)(AudioState *s, HW *hw)
>> {
>> - while ((hw = glue (audio_pcm_hw_find_any_, TYPE) (hw))) {
>> + while ((hw = glue(audio_pcm_hw_find_any_, TYPE)(s, hw))) {
>> if (hw->enabled) {
>> return hw;
>> }
>> @@ -215,12 +214,10 @@ static HW *glue (audio_pcm_hw_find_any_enabled_, TYPE) (HW *hw)
>> return NULL;
>> }
>>
>> -static HW *glue (audio_pcm_hw_find_specific_, TYPE) (
>> - HW *hw,
>> - struct audsettings *as
>> - )
>> +static HW *glue(audio_pcm_hw_find_specific_, TYPE)(AudioState *s, HW *hw,
>> + struct audsettings *as)
>> {
>> - while ((hw = glue (audio_pcm_hw_find_any_, TYPE) (hw))) {
>> + while ((hw = glue(audio_pcm_hw_find_any_, TYPE)(s, hw))) {
>> if (audio_pcm_info_eq (&hw->info, as)) {
>> return hw;
>> }
>> @@ -228,10 +225,10 @@ static HW *glue (audio_pcm_hw_find_specific_, TYPE) (
>> return NULL;
>> }
>>
>> -static HW *glue (audio_pcm_hw_add_new_, TYPE) (struct audsettings *as)
>> +static HW *glue(audio_pcm_hw_add_new_, TYPE)(AudioState *s,
>> + struct audsettings *as)
>> {
>> HW *hw;
>> - AudioState *s = &glob_audio_state;
>> struct audio_driver *drv = s->drv;
>>
>> if (!glue (s->nb_hw_voices_, TYPE)) {
>> @@ -255,6 +252,7 @@ static HW *glue (audio_pcm_hw_add_new_, TYPE) (struct audsettings *as)
>> return NULL;
>> }
>>
>> + hw->s = s;
>> hw->pcm_ops = drv->pcm_ops;
>> hw->ctl_caps = drv->ctl_caps;
>>
>> @@ -299,33 +297,33 @@ static HW *glue (audio_pcm_hw_add_new_, TYPE) (struct audsettings *as)
>> return NULL;
>> }
>>
>> -static HW *glue (audio_pcm_hw_add_, TYPE) (struct audsettings *as)
>> +static HW *glue(audio_pcm_hw_add_, TYPE)(AudioState *s, struct audsettings *as)
>> {
>> HW *hw;
>> - AudioState *s = &glob_audio_state;
>> AudiodevPerDirectionOptions *pdo = s->dev->TYPE;
>>
>> if (pdo->fixed_settings) {
>> - hw = glue (audio_pcm_hw_add_new_, TYPE) (as);
>> + hw = glue(audio_pcm_hw_add_new_, TYPE)(s, as);
>> if (hw) {
>> return hw;
>> }
>> }
>>
>> - hw = glue (audio_pcm_hw_find_specific_, TYPE) (NULL, as);
>> + hw = glue(audio_pcm_hw_find_specific_, TYPE)(s, NULL, as);
>> if (hw) {
>> return hw;
>> }
>>
>> - hw = glue (audio_pcm_hw_add_new_, TYPE) (as);
>> + hw = glue(audio_pcm_hw_add_new_, TYPE)(s, as);
>> if (hw) {
>> return hw;
>> }
>>
>> - return glue (audio_pcm_hw_find_any_, TYPE) (NULL);
>> + return glue(audio_pcm_hw_find_any_, TYPE)(s, NULL);
>> }
>>
>> -static SW *glue (audio_pcm_create_voice_pair_, TYPE) (
>> +static SW *glue(audio_pcm_create_voice_pair_, TYPE)(
>> + AudioState *s,
>> const char *sw_name,
>> struct audsettings *as
>> )
>> @@ -333,7 +331,6 @@ static SW *glue (audio_pcm_create_voice_pair_, TYPE) (
>> SW *sw;
>> HW *hw;
>> struct audsettings hw_as;
>> - AudioState *s = &glob_audio_state;
>> AudiodevPerDirectionOptions *pdo = s->dev->TYPE;
>>
>> if (pdo->fixed_settings) {
>> @@ -349,8 +346,9 @@ static SW *glue (audio_pcm_create_voice_pair_, TYPE) (
>> sw_name ? sw_name : "unknown", sizeof (*sw));
>> goto err1;
>> }
>> + sw->s = s;
>>
>> - hw = glue (audio_pcm_hw_add_, TYPE) (&hw_as);
>> + hw = glue(audio_pcm_hw_add_, TYPE)(s, &hw_as);
>> if (!hw) {
>> goto err2;
>> }
>> @@ -447,7 +445,7 @@ SW *glue (AUD_open_, TYPE) (
>> }
>> }
>> else {
>> - sw = glue (audio_pcm_create_voice_pair_, TYPE) (name, as);
>> + sw = glue(audio_pcm_create_voice_pair_, TYPE)(s, name, as);
>> if (!sw) {
>> dolog ("Failed to create voice `%s'\n", name);
>> return NULL;
>> diff --git a/audio/audio.c b/audio/audio.c
>> index 77bd8386d0..ef8ce3b91d 100644
>> --- a/audio/audio.c
>> +++ b/audio/audio.c
>> @@ -397,12 +397,10 @@ static void noop_conv (struct st_sample *dst, const void *src, int samples)
>> (void) samples;
>> }
>>
>> -static CaptureVoiceOut *audio_pcm_capture_find_specific (
>> - struct audsettings *as
>> - )
>> +static CaptureVoiceOut *audio_pcm_capture_find_specific(AudioState *s,
>> + struct audsettings *as)
>> {
>> CaptureVoiceOut *cap;
>> - AudioState *s = &glob_audio_state;
>>
>> for (cap = s->cap_head.lh_first; cap; cap = cap->entries.le_next) {
>> if (audio_pcm_info_eq (&cap->hw.info, as)) {
>> @@ -479,7 +477,7 @@ static void audio_detach_capture (HWVoiceOut *hw)
>>
>> static int audio_attach_capture (HWVoiceOut *hw)
>> {
>> - AudioState *s = &glob_audio_state;
>> + AudioState *s = hw->s;
>> CaptureVoiceOut *cap;
>>
>> audio_detach_capture (hw);
>> @@ -792,19 +790,15 @@ static void audio_pcm_print_info (const char *cap, struct audio_pcm_info *info)
>> /*
>> * Timer
>> */
>> -
>> -static bool audio_timer_running;
>> -static uint64_t audio_timer_last;
>> -
>> -static int audio_is_timer_needed (void)
>> +static int audio_is_timer_needed(AudioState *s)
>> {
>> HWVoiceIn *hwi = NULL;
>> HWVoiceOut *hwo = NULL;
>>
>> - while ((hwo = audio_pcm_hw_find_any_enabled_out (hwo))) {
>> + while ((hwo = audio_pcm_hw_find_any_enabled_out(s, hwo))) {
>> if (!hwo->poll_mode) return 1;
>> }
>> - while ((hwi = audio_pcm_hw_find_any_enabled_in (hwi))) {
>> + while ((hwi = audio_pcm_hw_find_any_enabled_in(s, hwi))) {
>> if (!hwi->poll_mode) return 1;
>> }
>> return 0;
>> @@ -812,18 +806,18 @@ static int audio_is_timer_needed (void)
>>
>> static void audio_reset_timer (AudioState *s)
>> {
>> - if (audio_is_timer_needed ()) {
>> + if (audio_is_timer_needed(s)) {
>> timer_mod_anticipate_ns(s->ts,
>> qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + s->period_ticks);
>> - if (!audio_timer_running) {
>> - audio_timer_running = true;
>> - audio_timer_last = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
>> + if (!s->timer_running) {
>> + s->timer_running = true;
>> + s->timer_last = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
>> trace_audio_timer_start(s->period_ticks / SCALE_MS);
>> }
>> } else {
>> timer_del(s->ts);
>> - if (audio_timer_running) {
>> - audio_timer_running = false;
>> + if (s->timer_running) {
>> + s->timer_running = false;
>> trace_audio_timer_stop();
>> }
>> }
>> @@ -835,11 +829,11 @@ static void audio_timer (void *opaque)
>> AudioState *s = opaque;
>>
>> now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
>> - diff = now - audio_timer_last;
>> + diff = now - s->timer_last;
>> if (diff > s->period_ticks * 3 / 2) {
>> trace_audio_timer_delayed(diff / SCALE_MS);
>> }
>> - audio_timer_last = now;
>> + s->timer_last = now;
>>
>> audio_run("timer");
>> audio_reset_timer(s);
>> @@ -893,7 +887,7 @@ void AUD_set_active_out (SWVoiceOut *sw, int on)
>>
>> hw = sw->hw;
>> if (sw->active != on) {
>> - AudioState *s = &glob_audio_state;
>> + AudioState *s = sw->s;
>> SWVoiceOut *temp_sw;
>> SWVoiceCap *sc;
>>
>> @@ -940,7 +934,7 @@ void AUD_set_active_in (SWVoiceIn *sw, int on)
>>
>> hw = sw->hw;
>> if (sw->active != on) {
>> - AudioState *s = &glob_audio_state;
>> + AudioState *s = sw->s;
>> SWVoiceIn *temp_sw;
>>
>> if (on) {
>> @@ -1063,7 +1057,7 @@ static void audio_run_out (AudioState *s)
>> HWVoiceOut *hw = NULL;
>> SWVoiceOut *sw;
>>
>> - while ((hw = audio_pcm_hw_find_any_enabled_out (hw))) {
>> + while ((hw = audio_pcm_hw_find_any_enabled_out(s, hw))) {
>> int played;
>> int live, free, nb_live, cleanup_required, prev_rpos;
>>
>> @@ -1168,7 +1162,7 @@ static void audio_run_in (AudioState *s)
>> {
>> HWVoiceIn *hw = NULL;
>>
>> - while ((hw = audio_pcm_hw_find_any_enabled_in (hw))) {
>> + while ((hw = audio_pcm_hw_find_any_enabled_in(s, hw))) {
>> SWVoiceIn *sw;
>> int captured = 0, min;
>>
>> @@ -1274,8 +1268,8 @@ static int audio_driver_init(AudioState *s, struct audio_driver *drv,
>> s->drv_opaque = drv->init(dev);
>>
>> if (s->drv_opaque) {
>> - audio_init_nb_voices_out (drv);
>> - audio_init_nb_voices_in (drv);
>> + audio_init_nb_voices_out(s, drv);
>> + audio_init_nb_voices_in(s, drv);
>> s->drv = drv;
>> return 0;
>> }
>> @@ -1294,11 +1288,11 @@ static void audio_vm_change_state_handler (void *opaque, int running,
>> int op = running ? VOICE_ENABLE : VOICE_DISABLE;
>>
>> s->vm_running = running;
>> - while ((hwo = audio_pcm_hw_find_any_enabled_out (hwo))) {
>> + while ((hwo = audio_pcm_hw_find_any_enabled_out(s, hwo))) {
>> hwo->pcm_ops->ctl_out(hwo, op);
>> }
>>
>> - while ((hwi = audio_pcm_hw_find_any_enabled_in (hwi))) {
>> + while ((hwi = audio_pcm_hw_find_any_enabled_in(s, hwi))) {
>> hwi->pcm_ops->ctl_in(hwi, op);
>> }
>> audio_reset_timer (s);
>> @@ -1318,7 +1312,7 @@ void audio_cleanup(void)
>> HWVoiceIn *hwi, *hwin;
>>
>> is_cleaning_up = true;
>> - QLIST_FOREACH_SAFE(hwo, &glob_audio_state.hw_head_out, entries, hwon) {
>> + QLIST_FOREACH_SAFE(hwo, &s->hw_head_out, entries, hwon) {
>> SWVoiceCap *sc;
>>
>> if (hwo->enabled) {
>> @@ -1337,7 +1331,7 @@ void audio_cleanup(void)
>> QLIST_REMOVE(hwo, entries);
>> }
>>
>> - QLIST_FOREACH_SAFE(hwi, &glob_audio_state.hw_head_in, entries, hwin) {
>> + QLIST_FOREACH_SAFE(hwi, &s->hw_head_in, entries, hwin) {
>> if (hwi->enabled) {
>> hwi->pcm_ops->ctl_in (hwi, VOICE_DISABLE);
>> }
>> @@ -1537,7 +1531,7 @@ CaptureVoiceOut *AUD_add_capture (
>> cb->ops = *ops;
>> cb->opaque = cb_opaque;
>>
>> - cap = audio_pcm_capture_find_specific (as);
>> + cap = audio_pcm_capture_find_specific(s, as);
>> if (cap) {
>> QLIST_INSERT_HEAD (&cap->cb_head, cb, entries);
>> return cap;
>> @@ -1554,6 +1548,7 @@ CaptureVoiceOut *AUD_add_capture (
>> }
>>
>> hw = &cap->hw;
>> + hw->s = s;
>> QLIST_INIT (&hw->sw_head);
>> QLIST_INIT (&cap->cb_head);
>>
>> @@ -1586,7 +1581,7 @@ CaptureVoiceOut *AUD_add_capture (
>> QLIST_INSERT_HEAD (&s->cap_head, cap, entries);
>> QLIST_INSERT_HEAD (&cap->cb_head, cb, entries);
>>
>> - QLIST_FOREACH(hw, &glob_audio_state.hw_head_out, entries) {
>> + QLIST_FOREACH(hw, &s->hw_head_out, entries) {
>> audio_attach_capture (hw);
>> }
>> return cap;
>> --
>> 2.20.1
>>
On Wed, Jan 23, 2019 at 09:16:07PM +0100, Zoltán Kővágó wrote: > On 2019-01-17 10:22, Gerd Hoffmann wrote: > > On Thu, Jan 17, 2019 at 12:36:48AM +0100, Kővágó, Zoltán wrote: > >> Remove glob_audio_state from functions, where possible without breaking > >> the API. This means that most static functions in audio.c now take an > >> AudioState pointer instead of implicitly using glob_audio_state. Also > >> included a pointer in SWVoice*, HWVoice* structs, so that functions > >> dealing them can know the audio state without having to pass it around > >> separately. > >> > >> This is required in order to support multiple simultaneous audio > >> backends (added in a later commit). > > > > I think it makes sense to split the series into smaller pieces, here > > would be a good place for the split (i.e. patches 1-14 which introduce > > -audiodev will be the first batch, this patch starts the next batch). > > Alright, I think this series is pretty useless without at least the > multiple simultaneous backends part, but if it's easier to review in > smaller chunks, let's do it. Also start merging stuff even though later in the series there are still open issues to be tackled (coreaudio breaking for example). So, I think with the first part the only open issue is whenever we go with the nested types (i.e. patch #1 as-is) or not. Given that the one-element-structs added in that patch will get additional fields I think the nesting makes sense. cheers, Gerd
Hi, > So, I think with the first part the only open issue is whenever we go > with the nested types (i.e. patch #1 as-is) or not. Given that the > one-element-structs added in that patch will get additional fields I > think the nesting makes sense. Spoke too soon: scripts/checkpatch.pl flags a bunch of codestyle issues. cheers, Gerd
On 2019-01-24 12:19, Gerd Hoffmann wrote: > Hi, > >> So, I think with the first part the only open issue is whenever we go >> with the nested types (i.e. patch #1 as-is) or not. Given that the >> one-element-structs added in that patch will get additional fields I >> think the nesting makes sense. > > Spoke too soon: scripts/checkpatch.pl flags a bunch of codestyle issues. > Most of them are about the code style of the old audio subsystem, I fixed some of them but not everything. IIRC last time it wasn't a problem, but it was in 2015. Should I go over them again and fix all of them? Regards, Zoltan
On Thu, Jan 24, 2019 at 09:12:58PM +0100, Zoltán Kővágó wrote: > On 2019-01-24 12:19, Gerd Hoffmann wrote: > > Hi, > > > >> So, I think with the first part the only open issue is whenever we go > >> with the nested types (i.e. patch #1 as-is) or not. Given that the > >> one-element-structs added in that patch will get additional fields I > >> think the nesting makes sense. > > > > Spoke too soon: scripts/checkpatch.pl flags a bunch of codestyle issues. > > Most of them are about the code style of the old audio subsystem, I > fixed some of them but not everything. IIRC last time it wasn't a > problem, but it was in 2015. Should I go over them again and fix all of > them? The first ones I saw where not a old audio codestyle (which is whitespace-after-function-name mostly) issues but newly introduced ones. A few rules have been added since 2015. Fixing the existing issues due to old audio code style (when changing/moving code) is fine, but not required. Newly added code should follow usual qemu code style. cheers, Gerd
© 2016 - 2025 Red Hat, Inc.