[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PULL 1/7] audio: fix pc speaker init
From: |
David Hildenbrand |
Subject: |
Re: [Qemu-devel] [PULL 1/7] audio: fix pc speaker init |
Date: |
Tue, 12 Feb 2019 13:25:08 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.4.0 |
On 12.02.19 13:20, David Hildenbrand wrote:
> On 12.02.19 13:08, Philippe Mathieu-Daudé wrote:
>> Hi David,
>>
>> On 2/12/19 12:47 PM, David Hildenbrand wrote:
>>> On 24.01.19 14:20, Gerd Hoffmann wrote:
>>>> Get rid of the pcspk_state global, allow pc speaker
>>>> be added using "-device isa-pcspk".
>>>>
>>>> Signed-off-by: Gerd Hoffmann <address@hidden>
>>>> Reviewed-by: Philippe Mathieu-Daudé <address@hidden>
>>>> Message-id: address@hidden
>>>> ---
>>>> hw/audio/pcspk.c | 35 +++++++++++++++--------------------
>>>> 1 file changed, 15 insertions(+), 20 deletions(-)
>>>>
>>>> diff --git a/hw/audio/pcspk.c b/hw/audio/pcspk.c
>>>> index 908696d483..b80a62ce90 100644
>>>> --- a/hw/audio/pcspk.c
>>>> +++ b/hw/audio/pcspk.c
>>>> @@ -57,7 +57,6 @@ typedef struct {
>>>> } PCSpkState;
>>>>
>>>> static const char *s_spk = "pcspk";
>>>> -static PCSpkState *pcspk_state;
>>>>
>>>> static inline void generate_samples(PCSpkState *s)
>>>> {
>>>> @@ -111,22 +110,6 @@ static void pcspk_callback(void *opaque, int free)
>>>> }
>>>> }
>>>>
>>>> -static int pcspk_audio_init(ISABus *bus)
>>>> -{
>>>> - PCSpkState *s = pcspk_state;
>>>> - struct audsettings as = {PCSPK_SAMPLE_RATE, 1, AUD_FMT_U8, 0};
>>>> -
>>>> - AUD_register_card(s_spk, &s->card);
>>>> -
>>>> - s->voice = AUD_open_out(&s->card, s->voice, s_spk, s, pcspk_callback,
>>>> &as);
>>>> - if (!s->voice) {
>>>> - AUD_log(s_spk, "Could not open voice\n");
>>>> - return -1;
>>>> - }
>>>> -
>>>> - return 0;
>>>> -}
>>>> -
>>>> static uint64_t pcspk_io_read(void *opaque, hwaddr addr,
>>>> unsigned size)
>>>> {
>>>> @@ -179,12 +162,20 @@ static void pcspk_initfn(Object *obj)
>>>>
>>>> static void pcspk_realizefn(DeviceState *dev, Error **errp)
>>>> {
>>>> + struct audsettings as = {PCSPK_SAMPLE_RATE, 1, AUD_FMT_U8, 0};
>>>> ISADevice *isadev = ISA_DEVICE(dev);
>>>> PCSpkState *s = PC_SPEAKER(dev);
>>>>
>>>> isa_register_ioport(isadev, &s->ioport, s->iobase);
>>>>
>>>> - pcspk_state = s;
>>>> + AUD_register_card(s_spk, &s->card);
>>>> +
>>>> + s->voice = AUD_open_out(&s->card, s->voice, s_spk, s, pcspk_callback,
>>>> &as);
>>>> + if (!s->voice) {
>>>> + error_setg(errp, "Initializing audio voice failed");
>>>> + AUD_remove_card(&s->card);
>>>> + return;
>>>> + }
>>>> }
>>>>
>>>> static bool migrate_needed(void *opaque)
>>>> @@ -221,8 +212,6 @@ static void pcspk_class_initfn(ObjectClass *klass,
>>>> void *data)
>>>> set_bit(DEVICE_CATEGORY_SOUND, dc->categories);
>>>> dc->vmsd = &vmstate_spk;
>>>> dc->props = pcspk_properties;
>>>> - /* Reason: realize sets global pcspk_state */
>>>> - dc->user_creatable = false;
>>>> }
>>>>
>>>> static const TypeInfo pcspk_info = {
>>>> @@ -233,6 +222,12 @@ static const TypeInfo pcspk_info = {
>>>> .class_init = pcspk_class_initfn,
>>>> };
>>>>
>>>> +static int pcspk_audio_init(ISABus *bus)
>>>> +{
>>>> + isa_create_simple(bus, TYPE_PC_SPEAKER);
>>>> + return 0;
>>>> +}
>>>> +
>>>> static void pcspk_register(void)
>>>> {
>>>> type_register_static(&pcspk_info);
>>>>
>>>
>>> I suddenly get (under fedora 28)
>>>
>>> ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect:
>>> Connection refused
>>>
>>> alsa: Could not initialize DAC
>>> alsa: Failed to open `default':
>>> alsa: Reason: Connection refused
>>> ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect:
>>> Connection refused
>>>
>>> alsa: Could not initialize DAC
>>> alsa: Failed to open `default':
>>> alsa: Reason: Connection refused
>>
>> This ALSA problem seems on your side.
>>
>>> audio: Failed to create voice `pcspk'
>>> qemu-system-x86_64: Initialization of device isa-pcspk failed:
>>> Initializing audio voice failed
>>
>> Previously the errors would be ignored and QEMU would start.
>
> I just did a fedora 28 uupdate + reboot. Problem still exists. Would be
> strange if only I would be hitting this problem with stock alsa libraries.
>
>>
>>>
>>>
>>> With
>>>
>>> sudo x86_64-softmmu/qemu-system-x86_64 \
>>> --enable-kvm \
>>> -m 4G,maxmem=40G,slots=2 \
>>> -smp sockets=2,cores=2 \
>>> -numa node,nodeid=0,cpus=0-1 -numa node,nodeid=1,cpus=2-3 \
>>> -kernel /boot/vmlinuz-4.19.6-200.fc28.x86_64 \
>>> -append "console=ttyS0 rd.shell rd.luks=0 rd.lvm=0 rd.md=0 rd.dm=0" \
>>> -initrd /boot/initramfs-4.19.6-200.fc28.x86_64.img \
>>> -machine pc,nvdimm \
>>> -nographic \
>>> -nodefaults \
>>> -chardev stdio,id=serial \
>>> --trace events=to_trace \
>>> -device isa-serial,chardev=serial \
>>> -chardev socket,id=monitor,path=/var/tmp/monitor,server,nowait \
>>> -mon chardev=monitor,mode=readline
>>>
>>>
>>> Could this be related to this patch? (or is maybe something about my
>>> system messed up? will try rebooting, but other audio - e.g. via firefox
>>> - works fine)
>>
>> Does your Firefox uses ALSA? The default install uses PulseAudio.
>
> Yes, I think so. I will try to find another tool to test ALSA.
>
>>
>> I think the behavior change you are experiencing comes from the patch 7
>> of this series "audio: probe audio drivers by default":
>>
>> @@ -879,7 +879,7 @@
>> Linux)
>> - audio_drv_list="oss"
>> + audio_drv_list="try-pa try-alsa try-sdl oss"
>>
>> Previously you were using OSS, and how the ./configure found via
>> pkg-config that you have the ALSA libs installed, and use ALSA first.
>>
>> Can you share the relevant part of the ./configure output?
>
> ./configure
> --target-list=s390x-linux-user,s390x-softmmu,s390x-linux-user,x86_64-softmmu,ppc-softmmu,ppc64-softmmu
> --enable-sdl --enable-spice --enable-kvm --enable-trace-backends=log
> --enable-debug-tcg
>
> Gives me
>
> Audio drivers alsa sdl oss
>
> Thanks!
>
>>
>> Thanks,
>>
>> Phil.
>>
>
>
Using speaker-test
t460s: ~ $ aplay -L
null
Discard all samples (playback) or generate zero samples (capture)
pulse
PulseAudio Sound Server
default
Default ALSA Output (currently PulseAudio Sound Server)
sysdefault:CARD=PCH
HDA Intel PCH, ALC293 Analog
Default Audio Device
t460s: ~ $ LANG=C speaker-test -c 2 -d default
speaker-test 1.1.6
Playback device is default
Stream parameters are 48000Hz, S16_LE, 2 channels
Using 16 octaves of pink noise
Rate set to 48000Hz (requested 48000Hz)
Buffer size range from 96 to 1048576
Period size range from 32 to 349526
Using max buffer size 1048576
Periods = 4
was set period_size = 262144
was set buffer_size = 1048576
ALSA <-> PulseAudio PCM I/O Plugin
Its setup is:
stream : PLAYBACK
access : RW_INTERLEAVED
format : S16_LE
subformat : STD
channels : 2
rate : 48000
exact rate : 48000 (48000/1)
msbits : 16
buffer_size : 1048576
period_size : 262144
period_time : 5461333
tstamp_mode : NONE
tstamp_type : GETTIMEOFDAY
period_step : 1
avail_min : 262144
period_event : 0
start_threshold : 1048576
stop_threshold : 1048576
silence_threshold: 0
silence_size : 0
boundary : 4611686018427387904
However, root seems to be the issue
t460s: ~ $ LANG=C sudo speaker-test -c 2 -d default
speaker-test 1.1.6
Playback device is default
Stream parameters are 48000Hz, S16_LE, 2 channels
Using 16 octaves of pink noise
ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect:
Connection refused
Playback open error: -111,Connection refused
--
Thanks,
David / dhildenb