From a59ef7845c23d6a2bc4b04667a85cd28ffea100e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=92=8B=E5=BF=97=E5=BA=86?= Date: Tue, 30 Dec 2025 14:56:03 +0800 Subject: [PATCH] hdi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 蒋志庆 --- .../native/midi/include/midi_client_private.h | 2 +- frameworks/native/midi/src/midi_client.cpp | 11 +++-- frameworks/native/ohmidi/OHMidi.cpp | 6 +-- interfaces/inner_api/native/midi_client.h | 4 +- interfaces/midi_info.h | 6 +-- sa_profile/midi_server.json | 2 +- services/BUILD.gn | 3 +- services/server/include/midi_device_driver.h | 8 ++- services/server/include/midi_device_usb.h | 10 ++-- services/server/src/midi_device_mananger.cpp | 4 +- services/server/src/midi_device_usb.cpp | 49 +++++++++++++------ .../server/src/midi_service_controller.cpp | 4 +- 12 files changed, 61 insertions(+), 48 deletions(-) diff --git a/frameworks/native/midi/include/midi_client_private.h b/frameworks/native/midi/include/midi_client_private.h index 020e69e..816fcc1 100644 --- a/frameworks/native/midi/include/midi_client_private.h +++ b/frameworks/native/midi/include/midi_client_private.h @@ -36,7 +36,7 @@ public: virtual ~MidiClientPrivate(); OH_MidiStatusCode Init(OH_MidiCallbacks callbacks, void *userData) override; OH_MidiStatusCode GetDevices(OH_MidiDeviceInformation *infos, size_t *numDevices) override; - OH_MidiStatusCode OpenDevice(int64_t deviceId, MidiDevice *midiDevice) override; + OH_MidiStatusCode OpenDevice(int64_t deviceId, MidiDevice **midiDevice) override; OH_MidiStatusCode GetDevicePorts(int64_t deviceId, OH_MidiPortInformation *infos, size_t *numPorts) override; OH_MidiStatusCode DestroyMidiClient() override; private: diff --git a/frameworks/native/midi/src/midi_client.cpp b/frameworks/native/midi/src/midi_client.cpp index 400c3dd..3ca661e 100644 --- a/frameworks/native/midi/src/midi_client.cpp +++ b/frameworks/native/midi/src/midi_client.cpp @@ -174,20 +174,20 @@ OH_MidiStatusCode MidiClientPrivate::GetDevices(OH_MidiDeviceInformation *infos, return MIDI_STATUS_OK; } -OH_MidiStatusCode MidiClientPrivate::OpenDevice(int64_t deviceId, MidiDevice *midiDevice) +OH_MidiStatusCode MidiClientPrivate::OpenDevice(int64_t deviceId, MidiDevice **midiDevice) { + CHECK_AND_RETURN_RET_LOG(midiDevice != nullptr, MIDI_STATUS_UNKNOWN_ERROR, "midiDevice is nullptr"); std::lock_guard lock(mutex_); auto ret = ipc_->OpenDevice(deviceId); CHECK_AND_RETURN_RET(ret == MIDI_STATUS_OK, ret); auto newDevice = new MidiDevicePrivate(ipc_, deviceId); - midiDevice = newDevice; + *midiDevice = newDevice; MIDI_INFO_LOG("Device opened: %{public}" PRId64, deviceId); return MIDI_STATUS_OK; } OH_MidiStatusCode MidiClientPrivate::GetDevicePorts(int64_t deviceId, OH_MidiPortInformation *infos, size_t *numPorts) { - std::lock_guard lock(mutex_); std::vector> portInfos; auto ret = ipc_->GetDevicePorts(deviceId, portInfos); @@ -214,14 +214,15 @@ OH_MidiStatusCode MidiClientPrivate::DestroyMidiClient() return ipc_->DestroyMidiClient(); } -OH_MidiStatusCode MidiClient::CreateMidiClient(MidiClient *client, OH_MidiCallbacks callbacks, void *userData) +OH_MidiStatusCode MidiClient::CreateMidiClient(MidiClient **client, OH_MidiCallbacks callbacks, void *userData) { + CHECK_AND_RETURN_RET_LOG(client != nullptr, MIDI_STATUS_UNKNOWN_ERROR, "client is nullptr"); std::lock_guard lock(clientsMutex); auto midiClient = std::make_unique(); OH_MidiStatusCode ret = midiClient->Init(callbacks, userData); CHECK_AND_RETURN_RET(ret == MIDI_STATUS_OK, ret); clients.push_back(std::move(midiClient)); - client = clients.back().get(); + *client = clients.back().get(); return MIDI_STATUS_OK; } } // namespace MIDI diff --git a/frameworks/native/ohmidi/OHMidi.cpp b/frameworks/native/ohmidi/OHMidi.cpp index 38f08df..8197012 100644 --- a/frameworks/native/ohmidi/OHMidi.cpp +++ b/frameworks/native/ohmidi/OHMidi.cpp @@ -22,7 +22,7 @@ OH_MidiStatusCode OH_MidiClient_Create(OH_MidiClient **client, OH_MidiCallbacks CHECK_AND_RETURN_RET_LOG(client != nullptr, MIDI_STATUS_GENERIC_INVALID_ARGUMENT,"client is nullptr"); OHOS::MIDI::MidiClient *midiclient = nullptr; - OH_MidiStatusCode ret = OHOS::MIDI::MidiClient::CreateMidiClient(midiclient, callbacks, userData); + OH_MidiStatusCode ret = OHOS::MIDI::MidiClient::CreateMidiClient(&midiclient, callbacks, userData); CHECK_AND_RETURN_RET_LOG(ret == MIDI_STATUS_OK, ret, "CreateMidiClient falid"); *client = (OH_MidiClient*)midiclient; return MIDI_STATUS_OK; @@ -36,7 +36,6 @@ OH_MidiStatusCode OH_MidiClient_Destroy(OH_MidiClient *client) OH_MidiStatusCode ret = midiclient->DestroyMidiClient(); CHECK_AND_RETURN_RET_LOG(ret == MIDI_STATUS_OK, ret, "DestroyMidiClient falid"); delete midiclient; - client = nullptr; return MIDI_STATUS_OK; } @@ -57,7 +56,7 @@ OH_MidiStatusCode OH_MidiOpenDevice(OH_MidiClient *client, int64_t deviceId, OH_ MIDI_STATUS_GENERIC_INVALID_ARGUMENT,"Invalid parameter"); OHOS::MIDI::MidiDevice *midiDevice = nullptr; - OH_MidiStatusCode ret = midiclient->OpenDevice(deviceId, midiDevice); + OH_MidiStatusCode ret = midiclient->OpenDevice(deviceId, &midiDevice); CHECK_AND_RETURN_RET_LOG(ret == MIDI_STATUS_OK, ret, "OpenDevice falid"); *device = (OH_MidiDevice*) midiDevice; @@ -79,7 +78,6 @@ OH_MidiStatusCode OH_MidiCloseDevice(OH_MidiDevice *device) OH_MidiStatusCode ret = midiDevice->CloseDevice(); CHECK_AND_RETURN_RET_LOG(ret == MIDI_STATUS_OK, ret, "CloseDevice falid"); delete midiDevice; - device = nullptr; return MIDI_STATUS_OK; } diff --git a/interfaces/inner_api/native/midi_client.h b/interfaces/inner_api/native/midi_client.h index 812360f..f0de9d5 100644 --- a/interfaces/inner_api/native/midi_client.h +++ b/interfaces/inner_api/native/midi_client.h @@ -28,10 +28,10 @@ public: class MidiClient { public: virtual ~MidiClient() = default; - static OH_MidiStatusCode CreateMidiClient(MidiClient *client, OH_MidiCallbacks callbacks, void *userData); + static OH_MidiStatusCode CreateMidiClient(MidiClient **client, OH_MidiCallbacks callbacks, void *userData); virtual OH_MidiStatusCode Init(OH_MidiCallbacks callbacks, void *userData); virtual OH_MidiStatusCode GetDevices(OH_MidiDeviceInformation *infos, size_t *numDevices); - virtual OH_MidiStatusCode OpenDevice(int64_t deviceId, MidiDevice *midiDevice); + virtual OH_MidiStatusCode OpenDevice(int64_t deviceId, MidiDevice **midiDevice); virtual OH_MidiStatusCode GetDevicePorts(int64_t deviceId, OH_MidiPortInformation *infos, size_t *numPorts); virtual OH_MidiStatusCode DestroyMidiClient(); }; diff --git a/interfaces/midi_info.h b/interfaces/midi_info.h index 93e638d..d5712c0 100644 --- a/interfaces/midi_info.h +++ b/interfaces/midi_info.h @@ -60,8 +60,8 @@ enum TransportProtocol { struct PortInformation { int64_t portId; - PortDirection direction; std::string name; + PortDirection direction; TransportProtocol transportProtocol; }; @@ -70,8 +70,8 @@ struct DeviceInformation{ int64_t driverDeviceId; DeviceType deviceType; TransportProtocol transportProtocol; - char productName[256]; - char vendorName[256]; + std::string productName; + std::string vendorName; std::vector portInfos; DeviceInformation() : deviceId(0), deviceType(DeviceType::DEVICE_TYPE_USB) {} }; diff --git a/sa_profile/midi_server.json b/sa_profile/midi_server.json index 9734037..84366dd 100644 --- a/sa_profile/midi_server.json +++ b/sa_profile/midi_server.json @@ -4,7 +4,7 @@ { "name": 3014, "libpath": "libmidi_service.z.so", - "run-on-create": true, + "run-on-create": false, "distributed": false, "start-on-demand": { "allow-update": false diff --git a/services/BUILD.gn b/services/BUILD.gn index 7228d7a..1115584 100644 --- a/services/BUILD.gn +++ b/services/BUILD.gn @@ -77,7 +77,8 @@ ohos_shared_library("midi_service") { "safwk:system_ability_fwk", "samgr:samgr_proxy", "common_event_service:cesfwk_innerkits", - "usb_manager:usbsrv_client" + "usb_manager:usbsrv_client", + "drivers_interface_midi:libmidi_proxy_1.0" ] cflags_cc = [ "-std=c++20" ] diff --git a/services/server/include/midi_device_driver.h b/services/server/include/midi_device_driver.h index f97f3ab..cd79c94 100644 --- a/services/server/include/midi_device_driver.h +++ b/services/server/include/midi_device_driver.h @@ -24,13 +24,11 @@ public: virtual std::vector GetRegisteredDevices() = 0; - virtual std::vector GetPortsForDevice(int64_t deviceId) = 0; + virtual int32_t OpenDevice(int64_t deviceId) = 0; - virtual bool OpenDevice(int64_t deviceId) = 0; + virtual int32_t CloseDevice(int64_t deviceId) = 0; - virtual bool CloseDevice(int64_t deviceId) = 0; - - virtual bool HanleUmpInput(int64_t deviceId, size_t portIndex, MidiEvent list) = 0; + virtual int32_t HanleUmpInput(int64_t deviceId, size_t portIndex, MidiEvent list) = 0; }; } diff --git a/services/server/include/midi_device_usb.h b/services/server/include/midi_device_usb.h index b6e9b3f..e0b2dd3 100644 --- a/services/server/include/midi_device_usb.h +++ b/services/server/include/midi_device_usb.h @@ -29,15 +29,13 @@ public: std::vector GetRegisteredDevices() override; - std::vector GetPortsForDevice(int64_t deviceId) override; + int32_t OpenDevice(int64_t deviceId) override; - bool OpenDevice(int64_t deviceId) override; + int32_t CloseDevice(int64_t deviceId) override; - bool CloseDevice(int64_t deviceId) override; - - bool HanleUmpInput(int64_t deviceId, size_t portIndex, MidiEvent list) override; + int32_t HanleUmpInput(int64_t deviceId, size_t portIndex, MidiEvent list) override; private: - sptr midiHdi_ = nullptr; + sptr midiHdi_ = nullptr; }; } } diff --git a/services/server/src/midi_device_mananger.cpp b/services/server/src/midi_device_mananger.cpp index fa8fea1..1d4f916 100644 --- a/services/server/src/midi_device_mananger.cpp +++ b/services/server/src/midi_device_mananger.cpp @@ -173,7 +173,7 @@ void MidiDeviceManager::CompareDevices(const std::vector& old MIDI_INFO_LOG("Device added: midiId=%{public}" PRId64 ", driverId=%{public}" PRId64 ", name: %{public}s", - newDevice.deviceId, newDevice.driverDeviceId, newDevice.productName); + newDevice.deviceId, newDevice.driverDeviceId, newDevice.productName.c_str()); } } @@ -188,7 +188,7 @@ void MidiDeviceManager::CompareDevices(const std::vector& old MIDI_INFO_LOG("Device removed: midiId=%{public}" PRId64 ", driverId=%{public}" PRId64 ", name: %{public}s", - oldDevice.deviceId, oldDevice.driverDeviceId, oldDevice.productName); + oldDevice.deviceId, oldDevice.driverDeviceId, oldDevice.productName.c_str()); } } diff --git a/services/server/src/midi_device_usb.cpp b/services/server/src/midi_device_usb.cpp index bb8b0ac..494eba4 100644 --- a/services/server/src/midi_device_usb.cpp +++ b/services/server/src/midi_device_usb.cpp @@ -10,35 +10,52 @@ UsbMidiTransportDeviceDriver::UsbMidiTransportDeviceDriver() { midiHdi_ = IMidiInterface::Get(true); } +static std::vector ConvertToDeviceInformation(const MidiDeviceInfo device) +{ + std::vector portInfos; + for (const auto &port : device.ports) + { + PortInformation portInfo; + portInfo.portId = port.portId; + portInfo.name = port.name; + portInfo.direction = (PortDirection)port.direction; + portInfo.transportProtocol = (TransportProtocol)device.protocol; + portInfos.push_back(portInfo); + } + return portInfos; +} std::vector UsbMidiTransportDeviceDriver::GetRegisteredDevices() { - // 默认返回空列表 - return std::vector(); + std::vector deviceList; + midiHdi_->GetDeviceList(deviceList); + std::vector deviceInfos; + for (auto device : deviceList) { + DeviceInformation devInfo; + devInfo.driverDeviceId = device.deviceId; + devInfo.deviceType = DEVICE_TYPE_USB; + devInfo.transportProtocol = (TransportProtocol)device.protocol; + devInfo.productName = device.productName; + devInfo.vendorName = device.vendorName; + devInfo.portInfos = ConvertToDeviceInformation(device); + deviceInfos.push_back(devInfo); + } + return deviceInfos; } -std::vector UsbMidiTransportDeviceDriver::GetPortsForDevice(int64_t deviceId) +int32_t UsbMidiTransportDeviceDriver::OpenDevice(int64_t deviceId) { - // 默认返回空列表 - return std::vector(); -} - -bool UsbMidiTransportDeviceDriver::OpenDevice(int64_t deviceId) -{ - // 默认返回失败 return midiHdi_->OpenDevice(deviceId); } -bool UsbMidiTransportDeviceDriver::CloseDevice(int64_t deviceId) +int32_t UsbMidiTransportDeviceDriver::CloseDevice(int64_t deviceId) { - // 默认返回失败 - return false; + return midiHdi_->OpenDevice(deviceId); } -bool UsbMidiTransportDeviceDriver::HanleUmpInput(int64_t deviceId, size_t portIndex, MidiEvent list) +int32_t UsbMidiTransportDeviceDriver::HanleUmpInput(int64_t deviceId, size_t portIndex, MidiEvent list) { - // 默认返回失败 - return false; + return 0; } } // namespace MIDI diff --git a/services/server/src/midi_service_controller.cpp b/services/server/src/midi_service_controller.cpp index 91a6576..3680ce8 100644 --- a/services/server/src/midi_service_controller.cpp +++ b/services/server/src/midi_service_controller.cpp @@ -125,7 +125,7 @@ int32_t MidiServiceController::OpenDevice(uint32_t clientId, int64_t deviceId) deviceId, clientId); return MIDI_STATUS_OK; } - if (!deviceManager_.OpenDevice(deviceId)) { + if (deviceManager_.OpenDevice(deviceId) != MIDI_STATUS_OK) { MIDI_ERR_LOG("Open device failed: deviceId=%{public}" PRId64, deviceId); return MIDI_STATUS_UNKNOWN_ERROR; } @@ -160,7 +160,7 @@ int32_t MidiServiceController::CloseDevice(uint32_t clientId, int64_t deviceId) if (clients.empty()) { deviceClientContexts_.erase(it); - if (!deviceManager_.CloseDevice(deviceId)) { + if (deviceManager_.CloseDevice(deviceId) != MIDI_STATUS_OK) { MIDI_ERR_LOG("Close device failed: deviceId=%{public}" PRId64, deviceId); return MIDI_STATUS_UNKNOWN_ERROR; }