@balaton
It doesn't work on a real C-Media device when passed to QEMU PPC AOS4.
The result is the same as with the -device usb-audio option.
Someone with a real Pegasos II or AmigaOne needs to let us know if this driver works for them.
I haven't tested it on QEMU Linux PPC.
EDIT:
Yes, you're right, I checked on emaculation.com. USB audio doesn't work on macOS X, only on macOS 9 – my mistake, sorry for the incorrect information.
https://gitlab.com/qemu-project/qemu/-/work_items/446https://www.emaculation.com/forum/viewtopic.php?p=81464#p81464EDIT2:
I ran a little experiment based on what you wrote
I added your patch to QEMU (QEMU version 9)
https://lists.nongnu.org/archive/html/ ... vel/2026-02/msg02357.html
-device pci-ohci -device usb-audio,bus=usb-bus.2,buffer=512,debug=1 -audio alsa
It looks like this in ‘qtree’
bus: pci.1
type PCI
dev: pci-ohci, id ""
masterbus = ""
num-ports = 3 (0x3)
firstport = 0 (0x0)
addr = 06.0
romfile = ""
romsize = 4294967295 (0xffffffff)
rombar = 1 (0x1)
multifunction = false
x-pcie-lnksta-dllla = true
x-pcie-extcap-init = true
failover_pair_id = ""
acpi-index = 0 (0x0)
x-pcie-err-unc-mask = true
x-pcie-ari-nextfn-1 = false
class USB controller, addr 00:06.0, pci id 106b:003f (sub 1af4:1100)
bar 0: mem at 0x8428c000 [0x8428c0ff]
bus: usb-bus.2
type usb-bus
dev: usb-audio, id ""
audiodev = "audiodev0"
debug = 1 (0x1)
buffer = 512 (0x200)
multi = false
port = ""
serial = ""
msos-desc = true
pcap = ""
addr 2.2, port 1, speed 12, name QEMU USB Audio Interface, attached
Debug output from AOS4 (the label ‘usb-audio’ comes from the QEMU driver debug output)
[USB] INFO | "USB Fkt Init" | "SetFktLanguageID" | [fkt 0x6fdd7150] Fkt has no languages
usb-audio: control transaction: request 0x8006 value 0x0300 index 0x0000 length 0x00ff
[USB] INFO | "USB Fkt Init" | "SetFktLanguageID" | [fkt 0x6fdd7150] Fkt has no languages
[USB] INFO | "USB Fkt Init" | "Init Fkt" | [fkt 0x6fdd7150] Fkt ("","","") initialized
usb-audio: control transaction: request 0x8006 value 0x0200 index 0x0000 length 0x0009
usb-audio: control transaction: request 0x8006 value 0x0200 index 0x0000 length 0x0071
usb-audio: control transaction: request 0x0009 value 0x0001 index 0x0000 length 0x0000
usb-audio: control transaction: request 0x8006 value 0x0300 index 0x0000 length 0x00ff
[USB] INFO | "USB FD Starter" | "SetFktLanguageID" | [fkt 0x6fdd7150] Fkt has no languages
usb-audio: control transaction: request 0x8006 value 0x0300 index 0x0000 length 0x00ff
[USB] INFO | "USB FD Starter" | "SetFktLanguageID" | [fkt 0x6fdd7150] Fkt has no languages
[USB] INFO | "USB FD Starter" | "Bind FD" | Trying FD "usbaudio.usbfd" v1.0 for Ifc 0x694A1880
[usbaudio.usbfd] USB Audio device attached, refreshing AHI modes
[USBAudio] libExpunge: OpenCnt=0
[USB] INFO | "USB FD Starter" | "Sys_EndInitialAttachmentPhase" | Initial USB Attachment Phase terminated
[USB] INFO | "USB FD Starter" | "Bind FD" | Trying FD "usbaudio.usbfd" v1.0 for Ifc 0x694A1740
[USB] INFO | "USB FD Starter" | "Bind FD" | FD "usbaudio.usbfd" did not support Ifc 0x694A1740
[USB] INFO | "USB FD Starter" | "Bind FD" | No driver found for fkt 0x6fdd7150/ifc 0x694a1740 {Class 0
....
USBAudio] AHIsub_AllocAudio: entry
[USBAudio] scan: waiting for USB stack full-boot...
[USBAudio] wait_fullboot: subscribed for STACKFULLBOOTED (0x6FE45530)
[USBAudio] wait_fullboot: timeout (stack already booted)
[USBAudio] scan: USB stack ready
[USBAudio] scan: opening libusb-1.library...
[USBAudio] scan: OpenLibrary returned 0x656AAD68
[USBAudio] libusb-1.library opened OK
[USBAudio] prefs: reading ENVARC:USBAudio.prefs
[USBAudio] prefs: added 46F4:0002 = "QEMU USB Audio"
[USBAudio] prefs: loaded 1 user device(s)
[USBAudio] scan_usb_audio_device: entry (scanned=0, num_devs=0)
[USBAudio] scan: calling libusb_get_device_list...
[libusb-1] ensure_usbsys_open: opening usbsys.device...
[libusb-1] ensure_usbsys_open: OpenDevice OK
[USBAudio] libusb_get_device_list: cnt=5, list=0x65CC5D88
[USBAudio] Device 0: VID=0x0000 PID=0x0000 Class=0x09
[USBAudio] Device 0: hub, skipping
[USBAudio] Device 1: VID=0x46F4 PID=0x0002 Class=0x00
[USBAudio] Ifc 0 Alt 0: Class=0x09 Sub=0x00 NumEP=1
[USBAudio] Ifc 0 Alt 0: Class=0x01 Sub=0x01 NumEP=0
[USBAudio] => Audio Control found! Ifc=0
[USBAudio] Ifc 0 Alt 0: Class=0x09 Sub=0x00 NumEP=1
[USBAudio] Ifc 0 Alt 0: Class=0x08 Sub=0x06 NumEP=2
[USBAudio] Ifc 0 Alt 0: Class=0x09 Sub=0x00 NumEP=1
[USBAudio] Ifc 1 Alt 0: Class=0x01 Sub=0x02 NumEP=0
[USBAudio] => Audio Streaming (playback) found! Ifc=1
[libusb1] libusb_open: rawIfc=0x694A1740 lad_Interface=0x654B7070 rawFunc=0x6FDD7150
usb-audio: control transaction: request 0x8006 value 0x0200 index 0x0000 length 0x0009
usb-audio: control transaction: request 0x8006 value 0x0200 index 0x0000 length 0x0071
[USBAudio] enumerate: config total_len=113 for 46F4:0002
[USBAudio] enumerate: best play so far: 2ch alt=1 ep=0x01 maxpkt=192
[USBAudio] enumerate: output #0 "Front" alt=1 ep=0x01 ch=2 offset=0 maxpkt=192
[USBAudio] enumerate: output FU ID=2 (USB Streaming)
[USBAudio] enumerate: 1 outputs, 0 inputs, default out=#0
[USBAudio] USB Audio device #0 found: "QEMU USB Audio"
[USBAudio] VID=0x46F4 PID=0x0002 Iface=1 Alt=1
[USBAudio] EP=0x01 MaxPkt=192 2ch/16bit
[USBAudio] Device 2: VID=0x0000 PID=0x0000 Class=0x09
[USBAudio] Device 2: hub, skipping
[USBAudio] Device 3: VID=0x46F4 PID=0x0001 Class=0x00
[USBAudio] Ifc 0 Alt 0: Class=0x09 Sub=0x00 NumEP=1
[USBAudio] Ifc 0 Alt 0: Class=0x01 Sub=0x01 NumEP=0
[USBAudio] => Audio Control found! Ifc=0
[USBAudio] Ifc 0 Alt 0: Class=0x09 Sub=0x00 NumEP=1
[USBAudio] Ifc 0 Alt 0: Class=0x08 Sub=0x06 NumEP=2
[USBAudio] Ifc 0 Alt 0: Class=0x09 Sub=0x00 NumEP=1
[USBAudio] Device 3: no Audio Streaming interface
[USBAudio] Device 4: VID=0x0000 PID=0x0000 Class=0x09
[USBAudio] Device 4: hub, skipping
[USBAudio] scan_usb_audio_device: 1 device(s) found, default="QEMU USB Audio"
[USBAudio] flat output #0: "Front"
[USBAudio] scan: 1 total outputs, 0 total inputs
[USBAudio] AHIsub_AllocAudio: OK, VID=0x46F4 PID=0x0002
[USBAudio] AHIsub_Start: Flags=0x00000001
[USBAudio] AHIsub_Stop: Flags=0x00000001
[libusb1] libusb_open: rawIfc=0x694A1740 lad_Interface=0x654B7070 rawFunc=0x6FDD7150
[USBAudio] Start: open_device VID=0x46F4 PID=0x0002 => handle=0x6718B6E8
[USBAudio] discover_usb_audio_details: entry
[USBAudio] discover: output mode #0: Ifc=1 Alt=1 EP=0x01 MaxPkt=192 Ch=2 Bits=16
[USBAudio] discover: Output FU ID=2 AC Ifc=0
[USBAudio] discover: querying output volume range...
usb-audio: control transaction: request 0xa182 value 0x0200 index 0x0200 length 0x0002
usb-audio: fail: get control
usb-audio: failed control transaction: request 0xa182 value 0x0200 index 0x0200 length 0x0002
usb-audio: control transaction: request 0x0201 value 0x0000 index 0x0000 length 0x0000
usb-audio: failed control transaction: request 0x0201 value 0x0000 index 0x0000 length 0x0000
[USBAudio] discover: GET_MIN volume failed (-9), disabling volume queries
[USBAudio] discover: no input Feature Unit, input gain not available
[USBAudio] Start: after discover => EP=0x01 Ifc=1 Alt=1 MaxPkt=192 Ch=2 Sub=2
[libusb1] claim_interface(1): rawIfc=0x694A1740 lad_Interface=0x654B7070
[libusb1] claim_interface: USBGetEndPoint(0x01) after claim(alt=0) => 0x00000000
[USBAudio] Start: claim_interface(1) => 0
[USBAudio] Start: calling set_alt_setting(1, 1)...
[libusb1] set_alt_setting(1,1): lad_Interface=0x654B7070 rawIfc=0x694A1740
usb-audio: control transaction: request 0x8006 value 0x0300 index 0x0000 length 0x00ff
[USB] INFO | "Sound" | "SetFktLanguageID" | [fkt 0x6fdd7150] Fkt has no languages
usb-audio: control transaction: request 0x010b value 0x0001 index 0x0001 length 0x0000
usb-audio: set interface 1
[libusb1] set_alt_setting: USBIntSetAltSettingA stat=1
[libusb1] set_alt_setting: declaiming for re-claim...
[libusb1] set_alt_setting: rawIfc after SetAlt: ifc=1 alt=1 numEP=1
[libusb1] set_alt_setting: re-claim rawIfc=0x694A1740 => lad_Interface=0x654B7070
[libusb1] set_alt_setting: USBGetEndPoint(NULL, ifc, 0x01)=0x657EA7B0
[libusb1] set_alt_setting: FOUND EP OUT 0x00 => 0x6FF45910
[libusb1] set_alt_setting: FOUND EP OUT 0x01 => 0x657EA7B0
[libusb1] set_alt_setting: brute-force scan complete
[USBAudio] Start: set_alt_setting => 0
[USBAudio] Start: setting sample rate 11025 Hz on EP 0x01
usb-audio: control transaction: request 0x2201 value 0x0100 index 0x0001 length 0x0003
usb-audio: failed control transaction: request 0x2201 value 0x0100 index 0x0001 length 0x0003
usb-audio: control transaction: request 0x0201 value 0x0000 index 0x0000 length 0x0000
usb-audio: failed control transaction: request 0x0201 value 0x0000 index 0x0000 length 0x0000
[USBAudio] Start: SET_CUR sample rate failed: -9
[USBAudio] Start: waiting for slave to signal alive...
[USBAudio] PlaySlave: entry, AudioCtrl=0x656AA440
[USBAudio] PlaySlave: EP=0x01 MaxPkt=192 Channels=2 SubSz=2
[USBAudio] PlaySlave: got UsbEndPoint 0x657EA7B0 for EP 0x01
[USBAudio] PlaySlave: cachedFrames=2 maxXferSize=192 xfersPerFrame=1
[USBAudio] PlaySlave: frameSize=4 baseSamples=11 fracNum=25/1000 framesPerIOR=8 iorCount=2
[USBAudio] PlaySlave: allocated 2 IORequests (1536 bytes, 8 subXfers each)
[USBAudio] PlaySlave: first mix produced 880 bytes
[USBAudio] PlaySlave: all 2 IORequests launched
[USBAudio] Start: slave alive, playback running
[USBAudio] AHIsub_Start: OK
Isochronous transfer had error 0x8
[USBAudio] AHIsub_Stop: Flags=0x00000001
[USBAudio] PlaySlave: exiting (loops=200 xfer_errors=0)
[USBAudio] Stop: waiting 500ms for USB stack to settle...
[USBAudio] Stop: set_alt_setting(1, 0)...
[libusb1] set_alt_setting(1,0): lad_Interface=0x654B7070 rawIfc=0x694A1740
usb-audio: control transaction: request 0x8006 value 0x0300 index 0x0000 length 0x00ff
[USB] INFO | "Sound" | "SetFktLanguageID" | [fkt 0x6fdd7150] Fkt has no languages
usb-audio: control transaction: request 0x010b value 0x0000 index 0x0001 length 0x0000
usb-audio: set interface 0
[libusb1] set_alt_setting: USBIntSetAltSettingA stat=1
[libusb1] set_alt_setting: declaiming for re-claim...
[libusb1] set_alt_setting: rawIfc after SetAlt: ifc=1 alt=0 numEP=0
[libusb1] set_alt_setting: re-claim rawIfc=0x694A1740 => lad_Interface=0x654B7070
[libusb1] set_alt_setting: USBGetEndPoint(NULL, ifc, 0x01)=0x00000000
[libusb1] set_alt_setting: FOUND EP OUT 0x00 => 0x6FF45910
[libusb1] set_alt_setting: brute-force scan complete
[USBAudio] Stop: release_interface(1)...
[USBAudio] Stop: closing device...
[USBAudio] Stop: device closed OK
[USBAudio] AHIsub_Stop: Flags=0x00000003
[USBAudio] Stop: stopping recording
[USBAudio] AHIsub_FreeAudio
[USBAudio] libOpen: version=2, our VERSION=2
[USBAudio] libOpen: OK, OpenCnt=1
[USBAudio] GetAttr: Attr=0x80000073 Arg=0 Def=1
[USBAudio] GetAttr: Attr=0x8000006F Arg=0 Def=128
[USBAudio] GetAttr: Attr=0x80000088 Arg=0 Def=0
[USBAudio] GetAttr: Attr=0x8000008B Arg=0 Def=1
[USBAudio] GetAttr: Attr=0x80000082 Arg=0 Def=0
[USBAudio] GetAttr: Attr=0x80000083 Arg=0 Def=0
[USBAudio] GetAttr: Attr=0x80000084 Arg=0 Def=65536
[USBAudio] GetAttr: Attr=0x80000085 Arg=0 Def=65536
[USBAudio] GetAttr: Attr=0x80000086 Arg=0 Def=65536
[USBAudio] GetAttr: Attr=0x80000087 Arg=0 Def=65536
[USBAudio] GetAttr: Attr=0x8000007C Arg=48000 Def=0
[USBAudio] GetAttr: Attr=0x8000007D Arg=0 Def=0
[USBAudio] GetAttr: Attr=0x80000076 Arg=0 Def=1721506440
[USBAudio] GetAttr: Attr=0x80000077 Arg=0 Def=1721506440
[USBAudio] GetAttr: Attr=0x80000078 Arg=0 Def=1721506440
[USBAudio] GetAttr: Attr=0x80000072 Arg=0 Def=0
[USBAudio] GetAttr: Attr=0x80000081 Arg=0 Def=0
[USBAudio] libOpen: version=2, our VERSION=2
[USBAudio] libOpen: OK, OpenCnt=1
[USBAudio] GetAttr: Attr=0x80000086 Arg=0 Def=65536
[USBAudio] libOpen: version=2, our VERSION=2
[USBAudio] libOpen: OK, OpenCnt=1
[USBAudio] GetAttr: Attr=0x80000082 Arg=0 Def=0
[USBAudio] libOpen: version=2, our VERSION=2
[USBAudio] libOpen: OK, OpenCnt=1
[USBAudio] GetAttr: Attr=0x80000084 Arg=0 Def=65536
[USBAudio] libOpen: version=2, our VERSION=2
[USBAudio] libOpen: OK, OpenCnt=1
[USBAudio] GetAttr: Attr=0x80000075 Arg=1 Def=0
[USBAudio] libOpen: version=2, our VERSION=2
[USBAudio] libOpen: OK, OpenCnt=1
[USBAudio] GetAttr: Attr=0x8000008A Arg=-1 Def=1766412296
[USBAudio] libOpen: version=2, our VERSION=2
[USBAudio] libOpen: OK, OpenCnt=1
[USBAudio] GetAttr: Attr=0x8000008D Arg=0 Def=1766412296
[USBAudio] libOpen: version=2, our VERSION=2
[USBAudio] libOpen: OK, OpenCnt=1
[USBAudio] GetAttr: Attr=0x8000006E Arg=0 Def=0
[USBAudio] libOpen: version=2, our VERSION=2
[USBAudio] libOpen: OK, OpenCnt=1
[USBAudio] AHIsub_AllocAudio: entry
[USBAudio] AHIsub_AllocAudio: OK, VID=0x46F4 PID=0x0002
[USBAudio] AHIsub_Start: Flags=0x00000001
[USBAudio] AHIsub_Stop: Flags=0x00000001
[libusb1] libusb_open: rawIfc=0x694A1740 lad_Interface=0x6FE43D60 rawFunc=0x6FDD7150
[USBAudio] Start: open_device VID=0x46F4 PID=0x0002 => handle=0x66599F98
[USBAudio] discover_usb_audio_details: entry
[USBAudio] discover: output mode #0: Ifc=1 Alt=1 EP=0x01 MaxPkt=192 Ch=2 Bits=16
[USBAudio] discover: Output FU ID=2 AC Ifc=0
[USBAudio] discover: skipping volume queries (previously failed)
[USBAudio] discover: no input Feature Unit, input gain not available
[USBAudio] Start: after discover => EP=0x01 Ifc=1 Alt=1 MaxPkt=192 Ch=2 Sub=2
[libusb1] claim_interface(1): rawIfc=0x694A1740 lad_Interface=0x6FE43D60
[libusb1] claim_interface: USBGetEndPoint(0x01) after claim(alt=0) => 0x00000000
[USBAudio] Start: claim_interface(1) => 0
[USBAudio] Start: calling set_alt_setting(1, 1)...
[libusb1] set_alt_setting(1,1): lad_Interface=0x6FE43D60 rawIfc=0x694A1740
usb-audio: control transaction: request 0x8006 value 0x0300 index 0x0000 length 0x00ff
[USB] INFO | "Sound" | "SetFktLanguageID" | [fkt 0x6fdd7150] Fkt has no languages
usb-audio: control transaction: request 0x010b value 0x0001 index 0x0001 length 0x0000
usb-audio: set interface 1
[libusb1] set_alt_setting: USBIntSetAltSettingA stat=1
[libusb1] set_alt_setting: declaiming for re-claim...
[libusb1] set_alt_setting: rawIfc after SetAlt: ifc=1 alt=1 numEP=1
[libusb1] set_alt_setting: re-claim rawIfc=0x694A1740 => lad_Interface=0x6FE43D60
[libusb1] set_alt_setting: USBGetEndPoint(NULL, ifc, 0x01)=0x66264E90
[libusb1] set_alt_setting: FOUND EP OUT 0x00 => 0x6FF45910
[libusb1] set_alt_setting: FOUND EP OUT 0x01 => 0x66264E90
[libusb1] set_alt_setting: brute-force scan complete
[USBAudio] Start: set_alt_setting => 0
[USBAudio] Start: setting sample rate 11025 Hz on EP 0x01
usb-audio: control transaction: request 0x2201 value 0x0100 index 0x0001 length 0x0003
usb-audio: failed control transaction: request 0x2201 value 0x0100 index 0x0001 length 0x0003
usb-audio: control transaction: request 0x0201 value 0x0000 index 0x0000 length 0x0000
usb-audio: failed control transaction: request 0x0201 value 0x0000 index 0x0000 length 0x0000
[USBAudio] Start: SET_CUR sample rate failed: -9
[USBAudio] Start: waiting for slave to signal alive...
[USBAudio] PlaySlave: entry, AudioCtrl=0x69452580
[USBAudio] PlaySlave: EP=0x01 MaxPkt=192 Channels=2 SubSz=2
[USBAudio] PlaySlave: got UsbEndPoint 0x66264E90 for EP 0x01
[USBAudio] PlaySlave: cachedFrames=2 maxXferSize=192 xfersPerFrame=1
[USBAudio] PlaySlave: frameSize=4 baseSamples=11 fracNum=25/1000 framesPerIOR=8 iorCount=2
[USBAudio] PlaySlave: allocated 2 IORequests (1536 bytes, 8 subXfers each)
[USBAudio] PlaySlave: first mix produced 880 bytes
[USBAudio] PlaySlave: all 2 IORequests launched
[USBAudio] Start: slave alive, playback running
[USBAudio] AHIsub_Start: OK
[USBAudio] AHIsub_Stop: Flags=0x00000001
[USBAudio] PlaySlave: exiting (loops=190 xfer_errors=0)
[USBAudio] Stop: waiting 500ms for USB stack to settle...
[USBAudio] Stop: set_alt_setting(1, 0)...
[libusb1] set_alt_setting(1,0): lad_Interface=0x6FE43D60 rawIfc=0x694A1740
usb-audio: control transaction: request 0x8006 value 0x0300 index 0x0000 length 0x00ff
[USB] INFO | "Sound" | "SetFktLanguageID" | [fkt 0x6fdd7150] Fkt has no languages
usb-audio: control transaction: request 0x010b value 0x0000 index 0x0001 length 0x0000
usb-audio: set interface 0
[libusb1] set_alt_setting: USBIntSetAltSettingA stat=1
[libusb1] set_alt_setting: declaiming for re-claim...
[libusb1] set_alt_setting: rawIfc after SetAlt: ifc=1 alt=0 numEP=0
[libusb1] set_alt_setting: re-claim rawIfc=0x694A1740 => lad_Interface=0x6FE43D60
[libusb1] set_alt_setting: USBGetEndPoint(NULL, ifc, 0x01)=0x00000000
[libusb1] set_alt_setting: FOUND EP OUT 0x00 => 0x6FF45910
[libusb1] set_alt_setting: brute-force scan complete
[USBAudio] Stop: release_interface(1)...
[USBAudio] Stop: closing device...
[USBAudio] Stop: device closed OK
[USBAudio] AHIsub_Stop: Flags=0x00000003
[USBAudio] Stop: stopping recording
[USBAudio] AHIsub_FreeAudio
Something’s alive and kicking – it’s a bit of a nightmare, but I can see the driver is communicating with the USB audio and nothing’s freezing up. I don’t think I can hear any sound, though.
It’s just an experiment, of course

EDIT3:
‘device usb-audio’ works under QEMU Linux PPC (slight audio distortion)
screen - >
https://ibb.co/JRxmbnp9screen (ohci) ->
https://ibb.co/0jXH2H7Hscreen (so everything’s in one place) virtio net, that works too ->
https://ibb.co/NdWWt0kbEDIT4:
I passed the “0d8c:000c C-Media Electronics” USB pass-through device to QEMU.
On Linux, QEMU PPC works without any issues.
On OS4, it doesn't work.
The device has an LED that lights up when it's in use. There's no indication that it's working.
Edited by smarkusg on 2026/3/19 7:34:07
Edited by smarkusg on 2026/3/19 11:31:36
Edited by smarkusg on 2026/3/19 13:42:59
Edited by smarkusg on 2026/3/19 13:43:29
Edited by smarkusg on 2026/3/19 13:59:43
Edited by smarkusg on 2026/3/19 14:31:39
Edited by smarkusg on 2026/3/21 0:00:02