From 69ebdfd6892bfd55840652177455c9d52326c3e4 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 21 Feb 2023 14:43:47 +0100 Subject: [PATCH] cellMic: random improvements --- rpcs3/Emu/Cell/Modules/cellMic.cpp | 348 ++++++++++++++++++----------- rpcs3/Emu/Cell/Modules/cellMic.h | 5 +- 2 files changed, 215 insertions(+), 138 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellMic.cpp b/rpcs3/Emu/Cell/Modules/cellMic.cpp index 6cd96e5a54..4fd683849a 100644 --- a/rpcs3/Emu/Cell/Modules/cellMic.cpp +++ b/rpcs3/Emu/Cell/Modules/cellMic.cpp @@ -117,7 +117,7 @@ void mic_context::operator()() { if (mic.has_data()) { - mic_queue->send(0, CELLMIC_DATA, dev_num, 0); + mic_queue->send(event_queue_source, CELLMIC_DATA, dev_num, 0); } } @@ -545,52 +545,13 @@ error_code cellMicEnd() // TODO mic_thr.init = 0; mic_thr.event_queue_key = 0; + mic_thr.event_queue_source = 0; return CELL_OK; } /// Open/Close Microphone Functions -error_code cellMicOpen(s32 dev_num, s32 sampleRate) -{ - cellMic.trace("cellMicOpen(dev_num=%d sampleRate=%d)", dev_num, sampleRate); - - auto& mic_thr = g_fxo->get(); - const std::lock_guard lock(mic_thr.mutex); - if (!mic_thr.init) - return CELL_MICIN_ERROR_NOT_INIT; - - if (!mic_thr.mic_list.count(dev_num)) - return CELL_MICIN_ERROR_DEVICE_NOT_FOUND; - - auto& device = ::at32(mic_thr.mic_list, dev_num); - - if (device.is_opened()) - return CELL_MICIN_ERROR_ALREADY_OPEN; - - return device.open_microphone(CELLMIC_SIGTYPE_DSP, sampleRate, sampleRate); -} - -error_code cellMicOpenRaw(s32 dev_num, s32 sampleRate, s32 maxChannels) -{ - cellMic.trace("cellMicOpenRaw(dev_num=%d, sampleRate=%d, maxChannels=%d)", dev_num, sampleRate, maxChannels); - - auto& mic_thr = g_fxo->get(); - const std::lock_guard lock(mic_thr.mutex); - if (!mic_thr.init) - return CELL_MICIN_ERROR_NOT_INIT; - - if (!mic_thr.mic_list.count(dev_num)) - return CELL_MICIN_ERROR_DEVICE_NOT_FOUND; - - auto& device = ::at32(mic_thr.mic_list, dev_num); - - if (device.is_opened()) - return CELL_MICIN_ERROR_ALREADY_OPEN; - - return device.open_microphone(CELLMIC_SIGTYPE_DSP | CELLMIC_SIGTYPE_RAW, sampleRate, sampleRate, maxChannels); -} - error_code cellMicOpenEx(s32 dev_num, s32 rawSampleRate, s32 rawChannel, s32 DSPSampleRate, s32 bufferSizeMS, u8 signalType) { cellMic.trace("cellMicOpenEx(dev_num=%d, rawSampleRate=%d, rawChannel=%d, DSPSampleRate=%d, bufferSizeMS=%d, signalType=0x%x)", @@ -601,7 +562,7 @@ error_code cellMicOpenEx(s32 dev_num, s32 rawSampleRate, s32 rawChannel, s32 DSP if (!mic_thr.init) return CELL_MICIN_ERROR_NOT_INIT; - if (!mic_thr.mic_list.count(dev_num)) + if (!mic_thr.mic_list.contains(dev_num)) return CELL_MICIN_ERROR_DEVICE_NOT_FOUND; auto& device = ::at32(mic_thr.mic_list, dev_num); @@ -614,6 +575,20 @@ error_code cellMicOpenEx(s32 dev_num, s32 rawSampleRate, s32 rawChannel, s32 DSP return device.open_microphone(signalType, DSPSampleRate, rawSampleRate, rawChannel); } +error_code cellMicOpen(s32 dev_num, s32 sampleRate) +{ + cellMic.trace("cellMicOpen(dev_num=%d sampleRate=%d)", dev_num, sampleRate); + + return cellMicOpenEx(dev_num, sampleRate, 2, sampleRate, 0x80, CELLMIC_SIGTYPE_DSP); +} + +error_code cellMicOpenRaw(s32 dev_num, s32 sampleRate, s32 maxChannels) +{ + cellMic.trace("cellMicOpenRaw(dev_num=%d, sampleRate=%d, maxChannels=%d)", dev_num, sampleRate, maxChannels); + + return cellMicOpenEx(dev_num, sampleRate, maxChannels, sampleRate, 0x80, CELLMIC_SIGTYPE_RAW); +} + u8 cellMicIsOpen(s32 dev_num) { cellMic.trace("cellMicIsOpen(dev_num=%d)", dev_num); @@ -623,7 +598,7 @@ u8 cellMicIsOpen(s32 dev_num) if (!mic_thr.init) return false; - if (!mic_thr.mic_list.count(dev_num)) + if (!mic_thr.mic_list.contains(dev_num)) return false; return ::at32(mic_thr.mic_list, dev_num).is_opened(); @@ -644,7 +619,7 @@ error_code cellMicClose(s32 dev_num) if (!mic_thr.init) return CELL_MICIN_ERROR_NOT_INIT; - if (!mic_thr.mic_list.count(dev_num)) + if (!mic_thr.mic_list.contains(dev_num)) return CELL_MICIN_ERROR_DEVICE_NOT_FOUND; auto& device = ::at32(mic_thr.mic_list, dev_num); @@ -657,38 +632,19 @@ error_code cellMicClose(s32 dev_num) /// Starting/Stopping Microphone Functions -error_code cellMicStart(s32 dev_num) -{ - cellMic.trace("cellMicStart(dev_num=%d)", dev_num); - - auto& mic_thr = g_fxo->get(); - const std::lock_guard lock(mic_thr.mutex); - if (!mic_thr.init) - return CELL_MICIN_ERROR_NOT_INIT; - - if (!mic_thr.mic_list.count(dev_num)) - return CELL_MICIN_ERROR_DEVICE_NOT_FOUND; - - auto& device = ::at32(mic_thr.mic_list, dev_num); - - if (!device.is_opened()) - return CELL_MICIN_ERROR_NOT_OPEN; - - return device.start_microphone(); -} - error_code cellMicStartEx(s32 dev_num, u32 iflags) { cellMic.todo("cellMicStartEx(dev_num=%d, iflags=%d)", dev_num, iflags); - // TODO: flags + if ((iflags & 0xfffffffc) != 0) // iflags > 3 + return CELL_MICIN_ERROR_PARAM; auto& mic_thr = g_fxo->get(); const std::lock_guard lock(mic_thr.mutex); if (!mic_thr.init) return CELL_MICIN_ERROR_NOT_INIT; - if (!mic_thr.mic_list.count(dev_num)) + if (!mic_thr.mic_list.contains(dev_num)) return CELL_MICIN_ERROR_DEVICE_NOT_FOUND; auto& device = ::at32(mic_thr.mic_list, dev_num); @@ -696,11 +652,19 @@ error_code cellMicStartEx(s32 dev_num, u32 iflags) if (!device.is_opened()) return CELL_MICIN_ERROR_NOT_OPEN; + // TODO: flags + cellMic.success("We're getting started mate!"); return device.start_microphone(); } +error_code cellMicStart(s32 dev_num) +{ + cellMic.trace("cellMicStart(dev_num=%d)", dev_num); + return cellMicStartEx(dev_num, 0); +} + error_code cellMicStop(s32 dev_num) { cellMic.trace("cellMicStop(dev_num=%d)", dev_num); @@ -710,7 +674,7 @@ error_code cellMicStop(s32 dev_num) if (!mic_thr.init) return CELL_MICIN_ERROR_NOT_INIT; - if (!mic_thr.mic_list.count(dev_num)) + if (!mic_thr.mic_list.contains(dev_num)) return CELL_MICIN_ERROR_DEVICE_NOT_FOUND; auto& device = ::at32(mic_thr.mic_list, dev_num); @@ -732,28 +696,36 @@ error_code cellMicGetDeviceAttr(s32 dev_num, CellMicDeviceAttr deviceAttributes, { cellMic.trace("cellMicGetDeviceAttr(dev_num=%d, deviceAttribute=%d, arg1=*0x%x, arg2=*0x%x)", dev_num, +deviceAttributes, arg1, arg2); - if (!arg1 || (!arg2 && deviceAttributes == CELLMIC_DEVATTR_CHANVOL)) - return CELL_MICIN_ERROR_PARAM; - auto& mic_thr = g_fxo->get(); const std::lock_guard lock(mic_thr.mutex); if (!mic_thr.init) return CELL_MICIN_ERROR_NOT_INIT; - if (!mic_thr.mic_list.count(dev_num)) + if (dev_num < 0) + return CELL_MICIN_ERROR_PARAM; + + if (!mic_thr.mic_list.contains(dev_num)) return CELL_MICIN_ERROR_DEVICE_NOT_FOUND; auto& device = ::at32(mic_thr.mic_list, dev_num); - switch (deviceAttributes) + if (arg1) { - case CELLMIC_DEVATTR_LED: *arg1 = device.attr_led; break; - case CELLMIC_DEVATTR_GAIN: *arg1 = device.attr_gain; break; - case CELLMIC_DEVATTR_VOLUME: *arg1 = device.attr_volume; break; - case CELLMIC_DEVATTR_AGC: *arg1 = device.attr_agc; break; - case CELLMIC_DEVATTR_CHANVOL: *arg1 = device.attr_volume; break; - case CELLMIC_DEVATTR_DSPTYPE: *arg1 = device.attr_dsptype; break; - default: return CELL_MICIN_ERROR_PARAM; + switch (deviceAttributes) + { + case CELLMIC_DEVATTR_LED: *arg1 = device.attr_led; break; + case CELLMIC_DEVATTR_GAIN: *arg1 = device.attr_gain; break; + case CELLMIC_DEVATTR_VOLUME: *arg1 = device.attr_volume; break; + case CELLMIC_DEVATTR_AGC: *arg1 = device.attr_agc; break; + case CELLMIC_DEVATTR_CHANVOL: *arg1 = device.attr_volume; break; + case CELLMIC_DEVATTR_DSPTYPE: *arg1 = device.attr_dsptype; break; + default: return CELL_MICIN_ERROR_PARAM; + } + } + + if (arg2) + { + *arg2 = static_cast((deviceAttributes & 0xffffU) << 0x10); } return CELL_OK; @@ -768,7 +740,7 @@ error_code cellMicSetDeviceAttr(s32 dev_num, CellMicDeviceAttr deviceAttributes, if (!mic_thr.init) return CELL_MICIN_ERROR_NOT_INIT; - if (!mic_thr.mic_list.count(dev_num)) + if (!mic_thr.mic_list.contains(dev_num)) return CELL_MICIN_ERROR_DEVICE_NOT_FOUND; auto& device = ::at32(mic_thr.mic_list, dev_num); @@ -779,7 +751,7 @@ error_code cellMicSetDeviceAttr(s32 dev_num, CellMicDeviceAttr deviceAttributes, // Used by SingStar to set the volume of each mic if (arg1 > 2) return CELL_MICIN_ERROR_PARAM; - device.attr_chanvol[arg1] = arg2; + ::at32(device.attr_chanvol, arg1) = arg2; break; case CELLMIC_DEVATTR_LED: device.attr_led = arg1; break; case CELLMIC_DEVATTR_GAIN: device.attr_gain = arg1; break; @@ -795,12 +767,48 @@ error_code cellMicSetDeviceAttr(s32 dev_num, CellMicDeviceAttr deviceAttributes, error_code cellMicGetSignalAttr(s32 dev_num, CellMicSignalAttr sig_attrib, vm::ptr value) { cellMic.todo("cellMicGetSignalAttr(dev_num=%d, sig_attrib=%d, value=*0x%x)", dev_num, +sig_attrib, value); + + if (!value) + return CELL_MICIN_ERROR_PARAM; + + auto& mic_thr = g_fxo->get(); + const std::lock_guard lock(mic_thr.mutex); + if (!mic_thr.init) + return CELL_MICIN_ERROR_NOT_INIT; + + if (!mic_thr.mic_list.contains(dev_num)) + return CELL_MICIN_ERROR_DEVICE_NOT_FOUND; + + auto& mic = ::at32(mic_thr.mic_list, dev_num); + if (!mic.is_opened()) + return CELL_MICIN_ERROR_NOT_OPEN; + + // TODO + return CELL_OK; } error_code cellMicSetSignalAttr(s32 dev_num, CellMicSignalAttr sig_attrib, vm::ptr value) { cellMic.todo("cellMicSetSignalAttr(dev_num=%d, sig_attrib=%d, value=*0x%x)", dev_num, +sig_attrib, value); + + if (!value) + return CELL_MICIN_ERROR_PARAM; + + auto& mic_thr = g_fxo->get(); + const std::lock_guard lock(mic_thr.mutex); + if (!mic_thr.init) + return CELL_MICIN_ERROR_NOT_INIT; + + if (!mic_thr.mic_list.contains(dev_num)) + return CELL_MICIN_ERROR_DEVICE_NOT_FOUND; + + auto& mic = ::at32(mic_thr.mic_list, dev_num); + if (!mic.is_opened()) + return CELL_MICIN_ERROR_NOT_OPEN; + + // TODO + return CELL_OK; } @@ -808,11 +816,21 @@ error_code cellMicGetSignalState(s32 dev_num, CellMicSignalState sig_state, vm:: { cellMic.todo("cellMicGetSignalState(dev_num=%d, sig_state=%d, value=*0x%x)", dev_num, +sig_state, value); + if (!value) + return CELL_MICIN_ERROR_PARAM; + auto& mic_thr = g_fxo->get(); const std::lock_guard lock(mic_thr.mutex); if (!mic_thr.init) return CELL_MICIN_ERROR_NOT_INIT; + if (!mic_thr.mic_list.contains(dev_num)) + return CELL_MICIN_ERROR_DEVICE_NOT_FOUND; + + auto& mic = ::at32(mic_thr.mic_list, dev_num); + if (!mic.is_opened()) + return CELL_MICIN_ERROR_NOT_OPEN; + be_t* ival = vm::_ptr(value.addr()); be_t* fval = vm::_ptr(value.addr()); @@ -842,19 +860,26 @@ error_code cellMicGetSignalState(s32 dev_num, CellMicSignalState sig_state, vm:: return CELL_OK; } -error_code cellMicGetFormatRaw(s32 dev_num, vm::ptr format) +error_code cellMicGetFormatEx(s32 dev_num, vm::ptr format, /*CellMicSignalType*/u32 type) { - cellMic.trace("cellMicGetFormatRaw(dev_num=%d, format=0x%x)", dev_num, format); + cellMic.trace("cellMicGetFormatEx(dev_num=%d, format=*0x%x, type=0x%x)", dev_num, format, type); + + if (!format) + return CELL_MICIN_ERROR_PARAM; auto& mic_thr = g_fxo->get(); const std::lock_guard lock(mic_thr.mutex); if (!mic_thr.init) return CELL_MICIN_ERROR_NOT_INIT; - if (!mic_thr.mic_list.count(dev_num)) + if (!mic_thr.mic_list.contains(dev_num)) return CELL_MICIN_ERROR_DEVICE_NOT_FOUND; auto& device = ::at32(mic_thr.mic_list, dev_num); + if (!device.is_opened()) + return CELL_MICIN_ERROR_NOT_OPEN; + + // TODO: type format->subframeSize = device.get_bit_resolution() / 8; // Probably? format->bitResolution = device.get_bit_resolution(); @@ -865,18 +890,28 @@ error_code cellMicGetFormatRaw(s32 dev_num, vm::ptr format) return CELL_OK; } +error_code cellMicGetFormat(s32 dev_num, vm::ptr format) +{ + cellMic.todo("cellMicGetFormat(dev_num=%d, format=*0x%x)", dev_num, format); + return cellMicGetFormatEx(dev_num, format, CELLMIC_SIGTYPE_DSP); +} + +error_code cellMicGetFormatRaw(s32 dev_num, vm::ptr format) +{ + cellMic.trace("cellMicGetFormatRaw(dev_num=%d, format=0x%x)", dev_num, format); + return cellMicGetFormatEx(dev_num, format, CELLMIC_SIGTYPE_RAW); +} + error_code cellMicGetFormatAux(s32 dev_num, vm::ptr format) { cellMic.todo("cellMicGetFormatAux(dev_num=%d, format=0x%x)", dev_num, format); - - return cellMicGetFormatRaw(dev_num, format); + return cellMicGetFormatEx(dev_num, format, CELLMIC_SIGTYPE_AUX); } error_code cellMicGetFormatDsp(s32 dev_num, vm::ptr format) { cellMic.todo("cellMicGetFormatDsp(dev_num=%d, format=0x%x)", dev_num, format); - - return cellMicGetFormatRaw(dev_num, format); + return cellMicGetFormatEx(dev_num, format, CELLMIC_SIGTYPE_DSP); } /// Event Queue Functions @@ -897,7 +932,8 @@ error_code cellMicSetNotifyEventQueue(u64 key) mic_thr.event_queue_key = key; - for (auto& mic_entry : mic_thr.mic_list) + // TODO: Properly generate/handle mic events + for (const auto& mic_entry : mic_thr.mic_list) { mic_queue->send(0, CELLMIC_ATTACH, mic_entry.first, 0); } @@ -907,7 +943,6 @@ error_code cellMicSetNotifyEventQueue(u64 key) error_code cellMicSetNotifyEventQueue2(u64 key, u64 source, u64 flag) { - // TODO: Actually do things with the source variable cellMic.todo("cellMicSetNotifyEventQueue2(key=0x%llx, source=0x%llx, flag=0x%llx", key, source, flag); auto& mic_thr = g_fxo->get(); @@ -920,8 +955,14 @@ error_code cellMicSetNotifyEventQueue2(u64 key, u64 source, u64 flag) if (!mic_queue) return CELL_MICIN_ERROR_EVENT_QUEUE; - mic_queue->send(0, CELLMIC_ATTACH, 0, 0); mic_thr.event_queue_key = key; + mic_thr.event_queue_source = source; + + // TODO: Properly generate/handle mic events + for (const auto& mic_entry : mic_thr.mic_list) + { + mic_queue->send(source, CELLMIC_ATTACH, mic_entry.first, 0); + } return CELL_OK; } @@ -936,16 +977,15 @@ error_code cellMicRemoveNotifyEventQueue(u64 key) return CELL_MICIN_ERROR_NOT_INIT; mic_thr.event_queue_key = 0; + mic_thr.event_queue_source = 0; return CELL_OK; } /// Reading Functions -error_code cellMicReadRaw(s32 dev_num, vm::ptr data, s32 max_bytes) +error_code cell_mic_read(s32 dev_num, vm::ptr data, s32 max_bytes, /*CellMicSignalType*/u32 type) { - cellMic.trace("cellMicReadRaw(dev_num=%d, data=0x%x, maxBytes=%d)", dev_num, data, max_bytes); - // TODO: CELL_MICIN_ERROR_PARAM auto& mic_thr = g_fxo->get(); @@ -953,49 +993,48 @@ error_code cellMicReadRaw(s32 dev_num, vm::ptr data, s32 max_bytes) if (!mic_thr.init) return CELL_MICIN_ERROR_NOT_INIT; - if (!mic_thr.mic_list.count(dev_num)) + if (!mic_thr.mic_list.contains(dev_num)) return CELL_MICIN_ERROR_DEVICE_NOT_FOUND; auto& mic = ::at32(mic_thr.mic_list, dev_num); - if (!mic.is_opened() || !(mic.get_signal_types() & CELLMIC_SIGTYPE_RAW)) + if (!mic.is_opened() || !(mic.get_signal_types() & type)) return CELL_MICIN_ERROR_NOT_OPEN; - return not_an_error(mic.read_raw(vm::_ptr(data.addr()), max_bytes)); + switch (type) + { + case CELLMIC_SIGTYPE_DSP: return not_an_error(mic.read_dsp(vm::_ptr(data.addr()), max_bytes)); + case CELLMIC_SIGTYPE_AUX: return CELL_OK; // TODO + case CELLMIC_SIGTYPE_RAW: return not_an_error(mic.read_raw(vm::_ptr(data.addr()), max_bytes)); + default: + fmt::throw_exception("Invalid CELLMIC_SIGTYPE %d", type); + } + + return CELL_OK; +} + +error_code cellMicReadRaw(s32 dev_num, vm::ptr data, s32 max_bytes) +{ + cellMic.trace("cellMicReadRaw(dev_num=%d, data=0x%x, maxBytes=%d)", dev_num, data, max_bytes); + return cell_mic_read(dev_num, data, max_bytes, CELLMIC_SIGTYPE_RAW); } error_code cellMicRead(s32 dev_num, vm::ptr data, u32 max_bytes) { cellMic.warning("cellMicRead(dev_num=%d, data=0x%x, maxBytes=0x%x)", dev_num, data, max_bytes); - - // TODO: CELL_MICIN_ERROR_PARAM - - auto& mic_thr = g_fxo->get(); - const std::lock_guard lock(mic_thr.mutex); - if (!mic_thr.init) - return CELL_MICIN_ERROR_NOT_INIT; - - if (!mic_thr.mic_list.count(dev_num)) - return CELL_MICIN_ERROR_DEVICE_NOT_FOUND; - - auto& mic = ::at32(mic_thr.mic_list, dev_num); - - if (!mic.is_opened() || !(mic.get_signal_types() & CELLMIC_SIGTYPE_DSP)) - return CELL_MICIN_ERROR_NOT_OPEN; - - return not_an_error(mic.read_dsp(vm::_ptr(data.addr()), max_bytes)); + return cell_mic_read(dev_num, data, max_bytes, CELLMIC_SIGTYPE_DSP); } error_code cellMicReadAux(s32 dev_num, vm::ptr data, s32 max_bytes) { cellMic.todo("cellMicReadAux(dev_num=%d, data=0x%x, max_bytes=0x%x)", dev_num, data, max_bytes); - return CELL_OK; + return cell_mic_read(dev_num, data, max_bytes, CELLMIC_SIGTYPE_AUX); } error_code cellMicReadDsp(s32 dev_num, vm::ptr data, s32 max_bytes) { - cellMic.todo("cellMicReadDsp(dev_num=%d, data=0x%x, max_bytes=0x%x)", dev_num, data, max_bytes); - return CELL_OK; + cellMic.warning("cellMicReadDsp(dev_num=%d, data=0x%x, max_bytes=0x%x)", dev_num, data, max_bytes); + return cell_mic_read(dev_num, data, max_bytes, CELLMIC_SIGTYPE_DSP); } /// Unimplemented Functions @@ -1009,6 +1048,36 @@ error_code cellMicReset(s32 dev_num) error_code cellMicGetDeviceGUID(s32 dev_num, vm::ptr ptr_guid) { cellMic.todo("cellMicGetDeviceGUID(dev_num=%d ptr_guid=*0x%x)", dev_num, ptr_guid); + + if (!ptr_guid) + return CELL_MICIN_ERROR_PARAM; + + *ptr_guid = 0xffffffff; + + auto& mic_thr = g_fxo->get(); + const std::lock_guard lock(mic_thr.mutex); + if (!mic_thr.init) + return CELL_MICIN_ERROR_NOT_INIT; + + // TODO + + return CELL_OK; +} + +error_code cellMicGetDeviceIdentifier(s32 dev_num, vm::ptr ptr_id) +{ + cellMic.todo("cellMicGetDeviceIdentifier(dev_num=%d, ptr_id=*0x%x)", dev_num, ptr_id); + + if (ptr_id) + *ptr_id = 0x0; + + auto& mic_thr = g_fxo->get(); + const std::lock_guard lock(mic_thr.mutex); + if (!mic_thr.init) + return CELL_MICIN_ERROR_NOT_INIT; + + // TODO + return CELL_OK; } @@ -1019,7 +1088,7 @@ error_code cellMicGetType(s32 dev_num, vm::ptr ptr_type) if (!ptr_type) return CELL_MICIN_ERROR_PARAM; - *ptr_type = CELLMIC_TYPE_USBAUDIO; + *ptr_type = CELLMIC_TYPE_BLUETOOTH; return CELL_OK; } @@ -1027,6 +1096,31 @@ error_code cellMicGetType(s32 dev_num, vm::ptr ptr_type) error_code cellMicGetStatus(s32 dev_num, vm::ptr status) { cellMic.todo("cellMicGetStatus(dev_num=%d, status=*0x%x)", dev_num, status); + + auto& mic_thr = g_fxo->get(); + const std::lock_guard lock(mic_thr.mutex); + if (!mic_thr.init) + return CELL_MICIN_ERROR_NOT_INIT; + + if (dev_num < 0 || !status) + return CELL_MICIN_ERROR_PARAM; + + // TODO + + if (mic_thr.mic_list.contains(dev_num)) + { + const auto& mic = ::at32(mic_thr.mic_list, dev_num); + status->raw_samprate = mic.get_raw_samplingrate(); + status->dsp_samprate = mic.get_raw_samplingrate(); + status->isStart = mic.is_started(); + status->isOpen = mic.is_opened(); + status->dsp_volume = 5; // TODO: 0 - 5 volume + status->local_voice = 10; // TODO: 0 - 10 confidence + status->remote_voice = 0; // TODO: 0 - 10 confidence + status->mic_energy = 60; // TODO: Db + status->spk_energy = 60; // TODO: Db + } + return CELL_OK; } @@ -1042,24 +1136,12 @@ error_code cellMicSysShareClose() return CELL_OK; } -error_code cellMicGetFormat(s32 dev_num, vm::ptr format) -{ - cellMic.todo("cellMicGetFormat(dev_num=%d, format=*0x%x)", dev_num, format); - return CELL_OK; -} - error_code cellMicSetMultiMicNotifyEventQueue() { UNIMPLEMENTED_FUNC(cellMic); return CELL_OK; } -error_code cellMicGetFormatEx() -{ - UNIMPLEMENTED_FUNC(cellMic); - return CELL_OK; -} - error_code cellMicSysShareStop() { UNIMPLEMENTED_FUNC(cellMic); @@ -1096,12 +1178,6 @@ error_code cellMicSysShareEnd() return CELL_OK; } -error_code cellMicGetDeviceIdentifier() -{ - UNIMPLEMENTED_FUNC(cellMic); - return CELL_OK; -} - DECLARE(ppu_module_manager::cellMic)("cellMic", []() { REG_FUNC(cellMic, cellMicInit); diff --git a/rpcs3/Emu/Cell/Modules/cellMic.h b/rpcs3/Emu/Cell/Modules/cellMic.h index 1565d788dc..c25b1dcbae 100644 --- a/rpcs3/Emu/Cell/Modules/cellMic.h +++ b/rpcs3/Emu/Cell/Modules/cellMic.h @@ -279,7 +279,7 @@ public: void update_audio(); bool has_data() const; - bool is_opened() const { return mic_opened; } + bool is_opened() const { return mic_opened; } bool is_started() const { return mic_started; } u8 get_signal_types() const { return signal_types; } u8 get_bit_resolution() const { return bit_resolution; } @@ -304,7 +304,7 @@ public: u32 attr_gain = 3; u32 attr_volume = 145; u32 attr_agc = 0; - u32 attr_chanvol[2] = {145, 145}; + std::array attr_chanvol = {145, 145}; u32 attr_led = 0; u32 attr_dsptype = 0; @@ -352,6 +352,7 @@ public: void load_config_and_init(); u64 event_queue_key = 0; + u64 event_queue_source = 0; std::unordered_map mic_list;