Files
AnyPS5/docs/dev/debt/libSceVoiceQoS.md
T

5.0 KiB

libSceVoiceQoS technical debt

Silent stubs

  • sceVoiceQoSReadPacket (libSceVoiceQoS) - network voice packet streaming is not implemented: it returns 0 and writes size 0 (indicating no packet is available). Aliens: Fireteam Elite (PPSA03393) calls it on its startup path (0x76D14C-0x76D16E) and stops with not implemented if it throws
  • sceVoiceQoSWritePacket (libSceVoiceQoS) - network voice packet streaming is not implemented: it returns 0 leaving *size untouched (treating all input bytes as accepted). Aliens: Fireteam Elite (PPSA03393) sets *size to the packet size before WritePacket (0x76CEB9-0x76CEC4), compares *size against that input size upon return (0x76CF07-0x76CF10) to verify all bytes were accepted, and stops with not implemented if it throws

Unknown function info

  • sceVoiceQoSSetConnectionAttribute (libSceVoiceQoS, NID KCGOxg8iX7s) is a throwing stub declared without parameters, like the other endpoint calls of the library: PPSA04159 fails to load without it and its signature is unknown. The name hashes to the imported NID (tools/nid_names.py)
  • sceVoiceQoSInit (libSceVoiceQoS) - 0x804E0905 for a second initialization comes from prosper's reading of the module and was not measured: on a PS5 a valid call blocks inside a homebrew payload, so it never returns there. PPSA26344's two call sites (0xE307BF, 0x151C45D) pass an allocated pointer, a 0x40000-byte block and app type 0x10000000; the app type and block are not used. sceVoiceQoSCreateLocalEndpoint takes four arguments (int* id, userId, deviceInId, deviceOutId) as declared in fpPS4 (src/ps4_libscevoice.pas, ps4_sceVoiceQoSCreateLocalEndpoint); signatures for DeleteLocalEndpoint(id), CreateRemoteEndpoint(int* id), DeleteRemoteEndpoint(id), Connect(int* id, local, remote), Disconnect(connection), SetLocalEndpointAttribute(id, attribute, value, size), SetRemoteEndpointAttribute(id, attribute, value, size), and GetLocalEndpointAttribute(id, attribute, value, size) were verified against call sites in Aliens: Fireteam Elite (PPSA03393, e.g. 0x76D132, 0x76D16E, 0x76CECB). Endpoints and connections are tracked by allocated id; duplicate connections and deleting an endpoint while referenced in a connection are permitted as the console is not known to reject them; endpoint attributes are stored as given (including empty or non-positive sizes), as their ids and defaults are unknown. The not-initialized error 0x804E0901 is assumed from the 0x804E09xx numbering, and unknown ids return ARGUMENT_INVALID. Aliens: Fireteam Elite (PPSA03393) uses all implemented calls on its load path; it stops with not implemented when any unimplemented call throws
  • libSceVoiceQoS firmware exports (libSceVoiceQoS) - sceVoiceQoSGetRemoteEndpointAttribute, sceVoiceQoSGetConnectionAttribute and sceVoiceQoSGetStatus follow public PS4 SDK prototypes in Orbital and remain throwing stubs as endpoint and connection attribute storage is unverified on hardware. sceVoiceQoSEnableChat, sceVoiceQoSDisableChat, sceVoiceQoSDebugGetStatus, sceVoiceQoSInitHQ, sceVoiceQoSSetMode, and sceVoiceQoSTerminate are declared without parameters from the firmware export database (aerolib.csv); their guest signatures are unverified on hardware and every call throws

Functional

  • sceVoiceQoSEnd (libSceVoiceQoS) - 0x804E0901 (not initialized) before any initialization was measured on a PS5 (firmware 13.60, #1407); ending an initialized library was not, because a valid sceVoiceQoSInit never returns inside a homebrew payload. PPSA14632 calls it at shutdown and PPSA26344 after a nonzero sceVoiceQoSInit. After an initialization it returns 0 and clears the init flag, so the library can be initialized again. Whether the console also ends the libSceVoice instance that its sceVoiceQoSInit starts (prosper's reading of the module), and what it answers while endpoints exist, is unknown; here it drops every endpoint and connection
  • sceVoiceQoSGetLocalEndpoint, sceVoiceQoSGetRemoteEndpoint (libSceVoiceQoS) - signatures follow Orbital (GetLocalEndpoint(connectionId, int* localId) and GetRemoteEndpoint(connectionId, int* remoteId)). Operations look up the connection by allocated id and return the connected local or remote endpoint id; an unknown connection id or null output pointer returns ARGUMENT_INVALID (0x804E0902), and calling before initialization returns 0x804E0901