пн, 14 окт. 2024 г., 17:26 Andrew Randrianasulu <randrianas...@gmail.com>:
> > > On Mon, Oct 14, 2024 at 12:21 PM Thomas Huth <th...@redhat.com> wrote: > >> On 14/10/2024 11.06, Peter Maydell wrote: >> > On Mon, 14 Oct 2024 at 02:13, Andrew Randrianasulu >> > <randrianas...@gmail.com> wrote: >> >> >> >> some 8 years ago this patch was sent to qemu-devel: >> >> >> >> https://lists.gnu.org/archive/html/qemu-devel/2016-06/msg05333.html >> >> "[Qemu-devel] [PATCH 7/7] Add ALSA ioctls" >> >> >> >> I wonder why it was rejected, may be as part of series? >> > >> > Hard to say from this distance, but looking at the patch >> > I think it probably was just that it was on the end of >> > a series that did a bunch of other things and the earlier >> > patches in the series had issues. >> >> Yes, looks like there were review comments on the series that were not >> addressed: >> >> https://lists.gnu.org/archive/html/qemu-devel/2016-06/msg05557.html >> https://lists.gnu.org/archive/html/qemu-devel/2016-06/msg05364.html >> >> But mainly one of the problems were that the patches haven't been send in >> a >> proper threaded way, so it was hard to follow the series: >> >> https://lists.gnu.org/archive/html/qemu-devel/2016-06/msg05546.html >> >> Anyway, looking at the other patches, it seems most of them were not >> related >> to ALSA, so you might be fine in just picking that patch, get it to work >> with the latest version of QEMU again and send just that single updated >> patch to this mailing list again. YMMV of course. >> > > I tried to apply patch but unfortunately mplayer still complain: > > [AO_ALSA] alsa-lib: pcm_hw.c:1578:(snd1_pcm_hw_open_fd) USER_PVERSION > failed > > [AO_ALSA] alsa-lib: pcm_dmix.c:1092:(snd_pcm_dmix_open) unable to open > slave > [AO_ALSA] Playback open error: Inappropriate ioctl for device > > this is 32-bit mplayer/qemu-i386 on top of 64-bit kernel (x86_64) > > qemu git 3860a2a8de56fad71db42f4ad120eb7eff03b51f > > ./configure --prefix=/usr --target-list=i386-linux-user > > so, may be qemu internal changed a bit, I tried to add MK_PTR around int/long types in ioctl.h like it was done for alsa timer ctl before but what to do with unsingned long in syscall_defs.h ? there is abi_int so I changed simple int to that. Anyway with attached patch it still fails to play, while arecord -L /aplay -L show their lists normal speaker-test run: strace -e ioctl /usr/bin/speaker-test 2>&1 | grep PVERSION ioctl(3, SNDRV_CTL_IOCTL_PVERSION, 0xff8bd008) = 0 ioctl(4, AGPIOC_INFO or SNDRV_PCM_IOCTL_PVERSION, 0xff8bcefc) = 0 ioctl(4, AGPIOC_RESERVE or SNDRV_PCM_IOCTL_USER_PVERSION, 0xff8bcf08) = 0 failed run with qemu-i386: strace -e ioctl qemu-i386 /usr/bin/speaker-test 2>&1 | grep PVERSION ioctl(3, SNDRV_CTL_IOCTL_PVERSION, 0xff8410ac) = 0 ioctl(4, AGPIOC_INFO or SNDRV_PCM_IOCTL_PVERSION, 0xff8410ac) = 0 > > >> >> Thomas >> >>
From cf7d1a606715376d0dfda350652612faaac04d90 Mon Sep 17 00:00:00 2001 From: Andrew Randrianasulu <randrianasulu@gmail.com> Date: Tue, 15 Oct 2024 16:52:24 +0300 Subject: [PATCH 2/2] linux-user: trying yo fix alsa ioctls, not working yet --- linux-user/ioctls.h | 36 ++++++++++++++++++------------------ linux-user/syscall_defs.h | 28 ++++++++++++++-------------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h index 3b0a134d13..f280d76b76 100644 --- a/linux-user/ioctls.h +++ b/linux-user/ioctls.h @@ -575,7 +575,7 @@ IOCTL(SOUND_MIXER_WRITE_LOUD, IOC_W, MK_PTR(TYPE_INT)) IOCTL(SOUND_MIXER_WRITE_RECSRC, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SNDRV_CTL_IOCTL_PVERSION, IOC_R, TYPE_INT) + IOCTL(SNDRV_CTL_IOCTL_PVERSION, IOC_R, MK_PTR(TYPE_INT)) IOCTL(SNDRV_CTL_IOCTL_CARD_INFO, IOC_R, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_card_info))) IOCTL(SNDRV_CTL_IOCTL_ELEM_LIST, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_elem_list))) IOCTL(SNDRV_CTL_IOCTL_ELEM_INFO, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_elem_info))) @@ -583,54 +583,54 @@ IOCTL(SNDRV_CTL_IOCTL_ELEM_WRITE, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_elem_value))) IOCTL(SNDRV_CTL_IOCTL_ELEM_LOCK, IOC_W, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_elem_id))) IOCTL(SNDRV_CTL_IOCTL_ELEM_UNLOCK, IOC_W, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_elem_id))) - IOCTL(SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS, IOC_RW, TYPE_INT) + IOCTL(SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS, IOC_RW, MK_PTR(TYPE_INT)) IOCTL(SNDRV_CTL_IOCTL_ELEM_ADD, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_elem_info))) IOCTL(SNDRV_CTL_IOCTL_ELEM_REPLACE, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_elem_info))) IOCTL(SNDRV_CTL_IOCTL_ELEM_REMOVE, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_elem_id))) IOCTL(SNDRV_CTL_IOCTL_TLV_READ, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_tlv))) IOCTL(SNDRV_CTL_IOCTL_TLV_WRITE, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_tlv))) IOCTL(SNDRV_CTL_IOCTL_TLV_COMMAND, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_tlv))) - IOCTL(SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE, IOC_RW, TYPE_INT) + IOCTL(SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE, IOC_RW, MK_PTR(TYPE_INT)) IOCTL(SNDRV_CTL_IOCTL_HWDEP_INFO, IOC_R, MK_PTR(MK_STRUCT(STRUCT_snd_hwdep_info))) - IOCTL(SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE, IOC_R, TYPE_INT) + IOCTL(SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE, IOC_R, MK_PTR(TYPE_INT)) IOCTL(SNDRV_CTL_IOCTL_PCM_INFO, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_pcm_info))) - IOCTL(SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE, IOC_W, TYPE_INT) - IOCTL(SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE, IOC_RW, TYPE_INT) + IOCTL(SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE, IOC_W, MK_PTR(TYPE_INT)) + IOCTL(SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE, IOC_RW, MK_PTR(TYPE_INT)) IOCTL(SNDRV_CTL_IOCTL_RAWMIDI_INFO, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_rawmidi_info))) - IOCTL(SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE, IOC_W, TYPE_INT) - IOCTL(SNDRV_CTL_IOCTL_POWER, IOC_RW, TYPE_INT) + IOCTL(SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE, IOC_W, MK_PTR(TYPE_INT)) + IOCTL(SNDRV_CTL_IOCTL_POWER, IOC_RW, MK_PTR(TYPE_INT)) IOCTL(SNDRV_CTL_IOCTL_POWER_STATE, IOC_R, TYPE_INT) /* alsa stuff */ - IOCTL(SNDRV_PCM_IOCTL_PVERSION , IOC_R, TYPE_INT) - IOCTL(SNDRV_PCM_IOCTL_INFO , IOC_R,MK_PTR(MK_STRUCT(STRUCT_snd_pcm_info))) - IOCTL(SNDRV_PCM_IOCTL_TSTAMP , IOC_W, TYPE_INT) - IOCTL(SNDRV_PCM_IOCTL_TTSTAMP , IOC_W, TYPE_INT) + IOCTL(SNDRV_PCM_IOCTL_PVERSION , IOC_R, MK_PTR(TYPE_INT)) + IOCTL(SNDRV_PCM_IOCTL_INFO , IOC_R, MK_PTR(MK_STRUCT(STRUCT_snd_pcm_info))) + IOCTL(SNDRV_PCM_IOCTL_TSTAMP , IOC_W, MK_PTR(TYPE_INT)) + IOCTL(SNDRV_PCM_IOCTL_TTSTAMP , IOC_W, MK_PTR(TYPE_INT)) IOCTL(SNDRV_PCM_IOCTL_HW_REFINE , IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_pcm_hw_params))) IOCTL(SNDRV_PCM_IOCTL_HW_PARAMS , IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_pcm_hw_params))) IOCTL(SNDRV_PCM_IOCTL_HW_FREE , 0, TYPE_NULL) IOCTL(SNDRV_PCM_IOCTL_SW_PARAMS , IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_pcm_sw_params))) IOCTL(SNDRV_PCM_IOCTL_STATUS , IOC_R, MK_PTR(MK_STRUCT(STRUCT_snd_pcm_status))) - IOCTL(SNDRV_PCM_IOCTL_DELAY , IOC_R, TYPE_ULONG) + IOCTL(SNDRV_PCM_IOCTL_DELAY , IOC_R, MK_PTR(TYPE_ULONG)) IOCTL(SNDRV_PCM_IOCTL_HWSYNC , 0, TYPE_NULL) IOCTL(SNDRV_PCM_IOCTL_SYNC_PTR , IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_pcm_sync_ptr))) IOCTL(SNDRV_PCM_IOCTL_STATUS_EXT , IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_pcm_status))) - IOCTL(SNDRV_PCM_IOCTL_CHANNEL_INFO , IOC_R,MK_PTR(MK_STRUCT(STRUCT_snd_pcm_channel_info))) + IOCTL(SNDRV_PCM_IOCTL_CHANNEL_INFO , IOC_R, MK_PTR(MK_STRUCT(STRUCT_snd_pcm_channel_info))) IOCTL(SNDRV_PCM_IOCTL_PREPARE , 0, TYPE_NULL) IOCTL(SNDRV_PCM_IOCTL_RESET , 0, TYPE_NULL) IOCTL(SNDRV_PCM_IOCTL_START , 0, TYPE_NULL) IOCTL(SNDRV_PCM_IOCTL_DROP , 0, TYPE_NULL) IOCTL(SNDRV_PCM_IOCTL_DRAIN , 0, TYPE_NULL) - IOCTL(SNDRV_PCM_IOCTL_PAUSE , IOC_W, TYPE_INT) - IOCTL(SNDRV_PCM_IOCTL_REWIND , IOC_W, TYPE_ULONG) + IOCTL(SNDRV_PCM_IOCTL_PAUSE , IOC_W, MK_PTR(TYPE_INT)) + IOCTL(SNDRV_PCM_IOCTL_REWIND , IOC_W, MK_PTR(TYPE_ULONG)) IOCTL(SNDRV_PCM_IOCTL_RESUME , 0, TYPE_NULL) IOCTL(SNDRV_PCM_IOCTL_XRUN , 0, TYPE_NULL) - IOCTL(SNDRV_PCM_IOCTL_FORWARD , IOC_W, TYPE_ULONG) + IOCTL(SNDRV_PCM_IOCTL_FORWARD , IOC_W, MK_PTR(TYPE_ULONG)) IOCTL(SNDRV_PCM_IOCTL_WRITEI_FRAMES , IOC_W, MK_PTR(MK_STRUCT(STRUCT_snd_xferi))) IOCTL(SNDRV_PCM_IOCTL_READI_FRAMES , IOC_R, MK_PTR(MK_STRUCT(STRUCT_snd_xferi))) IOCTL(SNDRV_PCM_IOCTL_WRITEN_FRAMES , IOC_W, MK_PTR(MK_STRUCT(STRUCT_snd_xfern))) IOCTL(SNDRV_PCM_IOCTL_READN_FRAMES , IOC_R, MK_PTR(MK_STRUCT(STRUCT_snd_xfern))) - IOCTL(SNDRV_PCM_IOCTL_LINK , IOC_W, TYPE_INT) + IOCTL(SNDRV_PCM_IOCTL_LINK , IOC_W, MK_PTR(TYPE_INT)) IOCTL(SNDRV_PCM_IOCTL_UNLINK , 0, TYPE_NULL) IOCTL(SNDRV_TIMER_IOCTL_PVERSION, IOC_R, MK_PTR(TYPE_INT)) diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index a56dde12e8..90e1111cd4 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -2669,7 +2669,7 @@ struct target_user_cap_data { }; /* asound defines */ -#define TARGET_SNDRV_CTL_IOCTL_PVERSION TARGET_IOR('U', 0x00, int) +#define TARGET_SNDRV_CTL_IOCTL_PVERSION TARGET_IOR('U', 0x00, abi_int) #define TARGET_SNDRV_CTL_IOCTL_CARD_INFO TARGET_IOR('U', 0x01, struct snd_ctl_card_info) #define TARGET_SNDRV_CTL_IOCTL_ELEM_LIST TARGET_IOWR('U', 0x10, struct snd_ctl_elem_list) #define TARGET_SNDRV_CTL_IOCTL_ELEM_INFO TARGET_IOWR('U', 0x11, struct snd_ctl_elem_info) @@ -2684,27 +2684,27 @@ struct target_user_cap_data { #define TARGET_SNDRV_CTL_IOCTL_TLV_READ TARGET_IOWR('U', 0x1a, struct snd_ctl_tlv) #define TARGET_SNDRV_CTL_IOCTL_TLV_WRITE TARGET_IOWR('U', 0x1b, struct snd_ctl_tlv) #define TARGET_SNDRV_CTL_IOCTL_TLV_COMMAND TARGET_IOWR('U', 0x1c, struct snd_ctl_tlv) -#define TARGET_SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE TARGET_IOWR('U', 0x20, int) +#define TARGET_SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE TARGET_IOWR('U', 0x20, abi_int) #define TARGET_SNDRV_CTL_IOCTL_HWDEP_INFO TARGET_IOR('U', 0x21, struct snd_hwdep_info) -#define TARGET_SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE TARGET_IOR('U', 0x30, int) +#define TARGET_SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE TARGET_IOR('U', 0x30, abi_int) #define TARGET_SNDRV_CTL_IOCTL_PCM_INFO TARGET_IOWR('U', 0x31, struct snd_pcm_info) -#define TARGET_SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE TARGET_IOW('U', 0x32, int) -#define TARGET_SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE TARGET_IOWR('U', 0x40, int) +#define TARGET_SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE TARGET_IOW('U', 0x32, abi_int) +#define TARGET_SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE TARGET_IOWR('U', 0x40, abi_int) #define TARGET_SNDRV_CTL_IOCTL_RAWMIDI_INFO TARGET_IOWR('U', 0x41, struct snd_rawmidi_info) -#define TARGET_SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE TARGET_IOW('U', 0x42, int) -#define TARGET_SNDRV_CTL_IOCTL_POWER TARGET_IOWR('U', 0xd0, int) -#define TARGET_SNDRV_CTL_IOCTL_POWER_STATE TARGET_IOR('U', 0xd1, int) +#define TARGET_SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE TARGET_IOW('U', 0x42, abi_int) +#define TARGET_SNDRV_CTL_IOCTL_POWER TARGET_IOWR('U', 0xd0, abi_int) +#define TARGET_SNDRV_CTL_IOCTL_POWER_STATE TARGET_IOR('U', 0xd1, abi_int) -#define TARGET_SNDRV_PCM_IOCTL_PVERSION TARGET_IOR('A', 0x00, int) +#define TARGET_SNDRV_PCM_IOCTL_PVERSION TARGET_IOR('A', 0x00, abi_int) #define TARGET_SNDRV_PCM_IOCTL_INFO TARGET_IOR('A', 0x01, struct snd_pcm_info) -#define TARGET_SNDRV_PCM_IOCTL_TSTAMP TARGET_IOW('A', 0x02, int) -#define TARGET_SNDRV_PCM_IOCTL_TTSTAMP TARGET_IOW('A', 0x03, int) +#define TARGET_SNDRV_PCM_IOCTL_TSTAMP TARGET_IOW('A', 0x02, abi_int) +#define TARGET_SNDRV_PCM_IOCTL_TTSTAMP TARGET_IOW('A', 0x03, abi_int) #define TARGET_SNDRV_PCM_IOCTL_HW_REFINE TARGET_IOWR('A', 0x10, struct snd_pcm_hw_params) #define TARGET_SNDRV_PCM_IOCTL_HW_PARAMS TARGET_IOWR('A', 0x11, struct snd_pcm_hw_params) #define TARGET_SNDRV_PCM_IOCTL_HW_FREE TARGET_IO('A', 0x12) #define TARGET_SNDRV_PCM_IOCTL_SW_PARAMS TARGET_IOWR('A', 0x13, struct snd_pcm_sw_params) #define TARGET_SNDRV_PCM_IOCTL_STATUS TARGET_IOR('A', 0x20, struct snd_pcm_status) -#define TARGET_SNDRV_PCM_IOCTL_DELAY TARGET_IOR('A', 0x21, long) +#define TARGET_SNDRV_PCM_IOCTL_DELAY TARGET_IOR('A', 0x21, abi_long) #define TARGET_SNDRV_PCM_IOCTL_HWSYNC TARGET_IO('A', 0x22) #define TARGET_SNDRV_PCM_IOCTL_SYNC_PTR TARGET_IOWR('A', 0x23, struct snd_pcm_sync_ptr) #define TARGET_SNDRV_PCM_IOCTL_STATUS_EXT TARGET_IOWR('A', 0x24, struct snd_pcm_status) @@ -2714,7 +2714,7 @@ struct target_user_cap_data { #define TARGET_SNDRV_PCM_IOCTL_START TARGET_IO('A', 0x42) #define TARGET_SNDRV_PCM_IOCTL_DROP TARGET_IO('A', 0x43) #define TARGET_SNDRV_PCM_IOCTL_DRAIN TARGET_IO('A', 0x44) -#define TARGET_SNDRV_PCM_IOCTL_PAUSE TARGET_IOW('A', 0x45, int) +#define TARGET_SNDRV_PCM_IOCTL_PAUSE TARGET_IOW('A', 0x45, abi_int) #define TARGET_SNDRV_PCM_IOCTL_REWIND TARGET_IOW('A', 0x46, unsigned long) #define TARGET_SNDRV_PCM_IOCTL_RESUME TARGET_IO('A', 0x47) #define TARGET_SNDRV_PCM_IOCTL_XRUN TARGET_IO('A', 0x48) @@ -2723,7 +2723,7 @@ struct target_user_cap_data { #define TARGET_SNDRV_PCM_IOCTL_READI_FRAMES TARGET_IOR('A', 0x51, struct snd_xferi) #define TARGET_SNDRV_PCM_IOCTL_WRITEN_FRAMES TARGET_IOW('A', 0x52, struct snd_xfern) #define TARGET_SNDRV_PCM_IOCTL_READN_FRAMES TARGET_IOR('A', 0x53, struct snd_xfern) -#define TARGET_SNDRV_PCM_IOCTL_LINK TARGET_IOW('A', 0x60, int) +#define TARGET_SNDRV_PCM_IOCTL_LINK TARGET_IOW('A', 0x60, abi_int) #define TARGET_SNDRV_PCM_IOCTL_UNLINK TARGET_IO('A', 0x61) -- 2.46.2