qemu-devel
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]