Skip to content

Commit 3dfd33e

Browse files
committed
Move messaging implementation to the new Messenger class.
MidiCIDevice should be offering API for MIDI-CI end user developers who wants to write client apps or service apps. Messanger is for those who want to extend MIDI-CI features.
1 parent d10ba28 commit 3dfd33e

File tree

10 files changed

+1046
-884
lines changed

10 files changed

+1046
-884
lines changed

ktmidi-ci-tool/src/commonMain/kotlin/dev/atsushieno/ktmidi/citool/CIDeviceModel.kt

+10-14
Original file line numberDiff line numberDiff line change
@@ -99,24 +99,20 @@ class CIDeviceModel(val parent: CIDeviceManager, val muid: Int, config: MidiCIDe
9999
device.sendDiscovery(defaultSenderGroup)
100100
}
101101

102-
// local profile configuration
102+
// remote profile configuration
103103

104-
fun updateLocalProfileTarget(profileState: MidiCIProfileState, address: Byte, enabled: Boolean, numChannelsRequested: Short) {
105-
val profile = device.localProfiles.profiles.first { it.address == profileState.address.value && it.profile == profileState.profile }
106-
device.localProfiles.update(profile, enabled, address, numChannelsRequested)
104+
fun sendProfileDetailsInquiry(address: Byte, muid: Int, profile: MidiCIProfileId, target: Byte) {
105+
device.requestProfileDetails(defaultSenderGroup, address, muid, profile, target)
107106
}
108107

109-
fun addLocalProfile(profile: MidiCIProfile) {
110-
device.localProfiles.add(profile)
111-
device.sendProfileAddedReport(defaultSenderGroup, profile)
112-
}
108+
// local profile configuration
113109

114-
fun removeLocalProfile(group: Byte, address: Byte, profileId: MidiCIProfileId) {
115-
// create a dummy entry...
116-
val profile = MidiCIProfile(profileId, group, address, false, 0)
117-
device.localProfiles.remove(profile)
118-
device.sendProfileRemovedReport(defaultSenderGroup, profile)
119-
}
110+
fun updateLocalProfileTarget(profileState: MidiCIProfileState, newAddress: Byte, enabled: Boolean, numChannelsRequested: Short) =
111+
device.updateLocalProfileTarget(profileState.profile, profileState.address.value, newAddress, enabled, numChannelsRequested)
112+
113+
fun addLocalProfile(profile: MidiCIProfile) = device.addLocalProfile(defaultSenderGroup, profile)
114+
115+
fun removeLocalProfile(group: Byte, address: Byte, profileId: MidiCIProfileId) = device.removeLocalProfile(group, address, profileId)
120116

121117
fun updateLocalProfileName(oldProfile: MidiCIProfileId, newProfile: MidiCIProfileId) {
122118
val removed = device.localProfiles.profiles.filter { it.profile == oldProfile }

ktmidi-ci-tool/src/commonMain/kotlin/dev/atsushieno/ktmidi/citool/CIInitiatorModel.kt

+1-9
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,6 @@ import dev.atsushieno.ktmidi.ci.propertycommonrules.PropertyResourceNames
1010
class CIInitiatorModel(private val device: CIDeviceModel) {
1111
private val initiator by lazy { device.device.initiator }
1212

13-
fun sendEndpointMessage(targetMUID: Int) {
14-
device.device.sendEndpointMessage(device.defaultSenderGroup, targetMUID)
15-
}
16-
17-
fun sendProfileDetailsInquiry(address: Byte, muid: Int, profile: MidiCIProfileId, target: Byte) {
18-
device.device.requestProfileDetails(device.defaultSenderGroup, address, muid, profile, target)
19-
}
20-
2113
fun sendGetPropertyDataRequest(destinationMUID: Int, resource: String, encoding: String?, paginateOffset: Int?, paginateLimit: Int?) {
2214
initiator.saveAndSendGetPropertyData(device.defaultSenderGroup, destinationMUID, resource, encoding, paginateOffset, paginateLimit)
2315
}
@@ -62,7 +54,7 @@ class ClientConnectionModel(val parent: CIDeviceModel, val conn: ClientConnectio
6254
channelControllerMessages: Byte = MidiMessageReportChannelControllerFlags.All,
6355
noteDataMessages: Byte = MidiMessageReportNoteDataFlags.All
6456
) {
65-
parent.device.sendMidiMessageReportInquiry(parent.defaultSenderGroup, address, targetMUID, messageDataControl, systemMessages, channelControllerMessages, noteDataMessages)
57+
parent.device.requestMidiMessageReport(parent.defaultSenderGroup, address, targetMUID, messageDataControl, systemMessages, channelControllerMessages, noteDataMessages)
6658
}
6759

6860
init {

ktmidi-ci-tool/src/commonMain/kotlin/dev/atsushieno/ktmidi/citool/view/ViewModel.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class ConnectionViewModel(val conn: ClientConnectionModel) {
7272
var selectedProfile = mutableStateOf<MidiCIProfileId?>(null)
7373

7474
fun sendProfileDetailsInquiry(profile: MidiCIProfileId, address: Byte, target: Byte) {
75-
ciDeviceManager.initiator.sendProfileDetailsInquiry(address, conn.conn.targetMUID, profile, target)
75+
ciDeviceManager.device.sendProfileDetailsInquiry(address, conn.conn.targetMUID, profile, target)
7676
}
7777

7878
fun selectProperty(propertyId: String) {

ktmidi-ci/api/android/ktmidi-ci.api

+78-67
Original file line numberDiff line numberDiff line change
@@ -544,76 +544,20 @@ public final class dev/atsushieno/ktmidi/ci/MessageDirection : java/lang/Enum {
544544
public static fun values ()[Ldev/atsushieno/ktmidi/ci/MessageDirection;
545545
}
546546

547-
public abstract interface class dev/atsushieno/ktmidi/ci/MidiCIClientPropertyRules {
548-
public abstract fun createDataRequestHeader (Ljava/lang/String;Ljava/util/Map;)Ljava/util/List;
549-
public abstract fun createStatusHeader (I)Ljava/util/List;
550-
public abstract fun createSubscriptionHeader (Ljava/lang/String;Ljava/util/Map;)Ljava/util/List;
551-
public abstract fun decodeBody (Ljava/util/List;Ljava/util/List;)Ljava/util/List;
552-
public abstract fun encodeBody (Ljava/util/List;Ljava/lang/String;)Ljava/util/List;
553-
public abstract fun getHeaderFieldBoolean (Ljava/util/List;Ljava/lang/String;)Z
554-
public abstract fun getHeaderFieldInteger (Ljava/util/List;Ljava/lang/String;)Ljava/lang/Integer;
555-
public abstract fun getHeaderFieldString (Ljava/util/List;Ljava/lang/String;)Ljava/lang/String;
556-
public abstract fun getMetadataList ()Ljava/util/List;
557-
public abstract fun getPropertyCatalogUpdated ()Ljava/util/List;
558-
public abstract fun getPropertyIdForHeader (Ljava/util/List;)Ljava/lang/String;
559-
public abstract fun getPropertyListRequest (BIB)Ldev/atsushieno/ktmidi/ci/Message$GetPropertyData;
560-
public abstract fun getSubscribedProperty (Ldev/atsushieno/ktmidi/ci/Message$SubscribeProperty;)Ljava/lang/String;
561-
public abstract fun getUpdatedValue (Ldev/atsushieno/ktmidi/ci/PropertyValue;ZLjava/lang/String;Ljava/util/List;)Lkotlin/Pair;
562-
public abstract fun onGetPropertyDataReply (Ldev/atsushieno/ktmidi/ci/Message$GetPropertyData;Ldev/atsushieno/ktmidi/ci/Message$GetPropertyDataReply;)V
563-
public abstract fun processPropertySubscriptionResult (Ljava/lang/Object;Ldev/atsushieno/ktmidi/ci/Message$SubscribePropertyReply;)V
564-
}
565-
566-
public final class dev/atsushieno/ktmidi/ci/MidiCIConstants {
567-
public static final field ADDRESS_FUNCTION_BLOCK B
568-
public static final field ADDRESS_GROUP B
569-
public static final field BROADCAST_MUID_28 I
570-
public static final field BROADCAST_MUID_32 I
571-
public static final field CI_VERSION_AND_FORMAT B
572-
public static final field DEFAULT_MAX_PROPERTY_CHUNK_SIZE I
573-
public static final field DEFAULT_MAX_SIMULTANEOUS_PROPERTY_REQUESTS B
574-
public static final field DEFAULT_RECEIVABLE_MAX_SYSEX_SIZE I
575-
public static final field ENDPOINT_STATUS_PRODUCT_INSTANCE_ID B
576-
public static final field INSTANCE Ldev/atsushieno/ktmidi/ci/MidiCIConstants;
577-
public static final field NO_FUNCTION_BLOCK B
578-
public static final field PROPERTY_EXCHANGE_MAJOR_VERSION B
579-
public static final field PROPERTY_EXCHANGE_MINOR_VERSION B
580-
public static final field STANDARD_DEFINED_PROFILE B
581-
public static final field SYSEX_SUB_ID_MIDI_CI B
582-
public static final field UNIVERSAL_SYSEX B
583-
public static final field WHOLE_FUNCTION_BLOCK B
584-
}
585-
586-
public final class dev/atsushieno/ktmidi/ci/MidiCIConverter {
587-
public static final field INSTANCE Ldev/atsushieno/ktmidi/ci/MidiCIConverter;
588-
public final fun decodeASCIIToString (Ljava/lang/String;)Ljava/lang/String;
589-
public final fun encodeStringToASCII (Ljava/lang/String;)Ljava/lang/String;
590-
}
591-
592-
public final class dev/atsushieno/ktmidi/ci/MidiCIDevice {
593-
public fun <init> (ILdev/atsushieno/ktmidi/ci/MidiCIDeviceConfiguration;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;)V
547+
public final class dev/atsushieno/ktmidi/ci/Messenger {
548+
public fun <init> (Ldev/atsushieno/ktmidi/ci/MidiCIDevice;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;)V
594549
public final fun defaultProcessEndpointReply (Ldev/atsushieno/ktmidi/ci/Message$EndpointReply;)V
595550
public final fun defaultProcessInvalidateMUID (Ldev/atsushieno/ktmidi/ci/Message$InvalidateMUID;)V
596551
public final fun defaultProcessMidiMessageReport (Ldev/atsushieno/ktmidi/ci/Message$MidiMessageReportInquiry;)V
597552
public final fun defaultProcessProfileDetailsInquiry (Ldev/atsushieno/ktmidi/ci/Message$ProfileDetailsInquiry;)V
598553
public final fun defaultProcessSetProfileOff (Ldev/atsushieno/ktmidi/ci/Message$SetProfileOff;)V
599554
public final fun defaultProcessSetProfileOn (Ldev/atsushieno/ktmidi/ci/Message$SetProfileOn;)V
600-
public final fun getConfig ()Ldev/atsushieno/ktmidi/ci/MidiCIDeviceConfiguration;
601-
public final fun getConnections ()Ljava/util/Map;
602-
public final fun getConnectionsChanged ()Ljava/util/List;
603-
public final fun getDevice ()Ldev/atsushieno/ktmidi/ci/MidiCIDeviceInfo;
604555
public final fun getDiscoveryReplyForInquiry (Ldev/atsushieno/ktmidi/ci/Message$DiscoveryInquiry;)Ldev/atsushieno/ktmidi/ci/Message$DiscoveryReply;
605556
public final fun getEndOfMidiMessageReportFor (Ldev/atsushieno/ktmidi/ci/Message$MidiMessageReportInquiry;)Ldev/atsushieno/ktmidi/ci/Message$MidiMessageReportNotifyEnd;
606557
public final fun getEndpointReplyForInquiry (Ldev/atsushieno/ktmidi/ci/Message$EndpointInquiry;)Ldev/atsushieno/ktmidi/ci/Message$EndpointReply;
607-
public final fun getInitiator ()Ldev/atsushieno/ktmidi/ci/PropertyExchangeInitiator;
608-
public final fun getLocalProfiles ()Ldev/atsushieno/ktmidi/ci/ObservableProfileList;
609-
public final fun getLogger ()Ldev/atsushieno/ktmidi/ci/Logger;
610-
public final fun getMessageReceived ()Ljava/util/List;
611558
public final fun getMidiMessageReportReplyFor (Ldev/atsushieno/ktmidi/ci/Message$MidiMessageReportInquiry;)Ldev/atsushieno/ktmidi/ci/Message$MidiMessageReportReply;
612-
public final fun getMidiMessageReporter ()Ldev/atsushieno/ktmidi/ci/MidiMessageReporter;
613-
public final fun getMuid ()I
614559
public final fun getOnAck ()Lkotlin/jvm/functions/Function8;
615560
public final fun getOnNak ()Lkotlin/jvm/functions/Function8;
616-
public final fun getOnProfileSet ()Ljava/util/List;
617561
public final fun getProcessAck ()Lkotlin/jvm/functions/Function8;
618562
public final fun getProcessDiscovery ()Lkotlin/jvm/functions/Function1;
619563
public final fun getProcessDiscoveryReply ()Lkotlin/jvm/functions/Function1;
@@ -643,28 +587,24 @@ public final class dev/atsushieno/ktmidi/ci/MidiCIDevice {
643587
public final fun getProcessSubscribePropertyReply ()Lkotlin/jvm/functions/Function1;
644588
public final fun getProcessUnknownCIMessage ()Lkotlin/jvm/functions/Function2;
645589
public final fun getProfileRepliesForInquiry (Ldev/atsushieno/ktmidi/ci/Message$ProfileInquiry;)Lkotlin/sequences/Sequence;
646-
public final fun getRequestIdSerial ()B
647-
public final fun getResponder ()Ldev/atsushieno/ktmidi/ci/PropertyExchangeResponder;
648-
public final fun getUnknownMessageReceived ()Ljava/util/List;
649590
public final fun handleNewEndpoint (Ldev/atsushieno/ktmidi/ci/Message$DiscoveryReply;)V
650591
public final fun invalidateMUID (BBILjava/lang/String;)V
651592
public final fun processInput (BLjava/util/List;)V
652-
public final fun requestProfileDetails (BBILdev/atsushieno/ktmidi/ci/MidiCIProfileId;B)V
653-
public final fun requestProfiles (BBI)V
654593
public final fun send (Ldev/atsushieno/ktmidi/ci/Message;)V
655594
public final fun sendDiscovery (BB)V
656-
public static synthetic fun sendDiscovery$default (Ldev/atsushieno/ktmidi/ci/MidiCIDevice;BBILjava/lang/Object;)V
595+
public static synthetic fun sendDiscovery$default (Ldev/atsushieno/ktmidi/ci/Messenger;BBILjava/lang/Object;)V
657596
public final fun sendEndpointMessage (BIB)V
658-
public static synthetic fun sendEndpointMessage$default (Ldev/atsushieno/ktmidi/ci/MidiCIDevice;BIBILjava/lang/Object;)V
597+
public static synthetic fun sendEndpointMessage$default (Ldev/atsushieno/ktmidi/ci/Messenger;BIBILjava/lang/Object;)V
659598
public final fun sendMidiMessageReportInquiry (BBIBBBB)V
660599
public final fun sendNakForError (Ldev/atsushieno/ktmidi/ci/Message$Common;BBBLjava/util/List;Ljava/lang/String;)V
661-
public static synthetic fun sendNakForError$default (Ldev/atsushieno/ktmidi/ci/MidiCIDevice;Ldev/atsushieno/ktmidi/ci/Message$Common;BBBLjava/util/List;Ljava/lang/String;ILjava/lang/Object;)V
600+
public static synthetic fun sendNakForError$default (Ldev/atsushieno/ktmidi/ci/Messenger;Ldev/atsushieno/ktmidi/ci/Message$Common;BBBLjava/util/List;Ljava/lang/String;ILjava/lang/Object;)V
662601
public final fun sendNakForUnknownCIMessage (BLjava/util/List;)V
663602
public final fun sendNakForUnknownMUID (Ldev/atsushieno/ktmidi/ci/Message$Common;B)V
664603
public final fun sendProcessInquiry (BI)V
665604
public final fun sendProfileAddedReport (BLdev/atsushieno/ktmidi/ci/MidiCIProfile;)V
605+
public final fun sendProfileDetailsInquiry (BBILdev/atsushieno/ktmidi/ci/MidiCIProfileId;B)V
606+
public final fun sendProfileInquiry (BBI)V
666607
public final fun sendProfileRemovedReport (BLdev/atsushieno/ktmidi/ci/MidiCIProfile;)V
667-
public final fun setMidiMessageReporter (Ldev/atsushieno/ktmidi/ci/MidiMessageReporter;)V
668608
public final fun setOnAck (Lkotlin/jvm/functions/Function8;)V
669609
public final fun setOnNak (Lkotlin/jvm/functions/Function8;)V
670610
public final fun setProcessAck (Lkotlin/jvm/functions/Function8;)V
@@ -694,7 +634,78 @@ public final class dev/atsushieno/ktmidi/ci/MidiCIDevice {
694634
public final fun setProcessSubscribeProperty (Lkotlin/jvm/functions/Function1;)V
695635
public final fun setProcessSubscribePropertyReply (Lkotlin/jvm/functions/Function1;)V
696636
public final fun setProcessUnknownCIMessage (Lkotlin/jvm/functions/Function2;)V
637+
}
638+
639+
public abstract interface class dev/atsushieno/ktmidi/ci/MidiCIClientPropertyRules {
640+
public abstract fun createDataRequestHeader (Ljava/lang/String;Ljava/util/Map;)Ljava/util/List;
641+
public abstract fun createStatusHeader (I)Ljava/util/List;
642+
public abstract fun createSubscriptionHeader (Ljava/lang/String;Ljava/util/Map;)Ljava/util/List;
643+
public abstract fun decodeBody (Ljava/util/List;Ljava/util/List;)Ljava/util/List;
644+
public abstract fun encodeBody (Ljava/util/List;Ljava/lang/String;)Ljava/util/List;
645+
public abstract fun getHeaderFieldBoolean (Ljava/util/List;Ljava/lang/String;)Z
646+
public abstract fun getHeaderFieldInteger (Ljava/util/List;Ljava/lang/String;)Ljava/lang/Integer;
647+
public abstract fun getHeaderFieldString (Ljava/util/List;Ljava/lang/String;)Ljava/lang/String;
648+
public abstract fun getMetadataList ()Ljava/util/List;
649+
public abstract fun getPropertyCatalogUpdated ()Ljava/util/List;
650+
public abstract fun getPropertyIdForHeader (Ljava/util/List;)Ljava/lang/String;
651+
public abstract fun getPropertyListRequest (BIB)Ldev/atsushieno/ktmidi/ci/Message$GetPropertyData;
652+
public abstract fun getSubscribedProperty (Ldev/atsushieno/ktmidi/ci/Message$SubscribeProperty;)Ljava/lang/String;
653+
public abstract fun getUpdatedValue (Ldev/atsushieno/ktmidi/ci/PropertyValue;ZLjava/lang/String;Ljava/util/List;)Lkotlin/Pair;
654+
public abstract fun onGetPropertyDataReply (Ldev/atsushieno/ktmidi/ci/Message$GetPropertyData;Ldev/atsushieno/ktmidi/ci/Message$GetPropertyDataReply;)V
655+
public abstract fun processPropertySubscriptionResult (Ljava/lang/Object;Ldev/atsushieno/ktmidi/ci/Message$SubscribePropertyReply;)V
656+
}
657+
658+
public final class dev/atsushieno/ktmidi/ci/MidiCIConstants {
659+
public static final field ADDRESS_FUNCTION_BLOCK B
660+
public static final field ADDRESS_GROUP B
661+
public static final field BROADCAST_MUID_28 I
662+
public static final field BROADCAST_MUID_32 I
663+
public static final field CI_VERSION_AND_FORMAT B
664+
public static final field DEFAULT_MAX_PROPERTY_CHUNK_SIZE I
665+
public static final field DEFAULT_MAX_SIMULTANEOUS_PROPERTY_REQUESTS B
666+
public static final field DEFAULT_RECEIVABLE_MAX_SYSEX_SIZE I
667+
public static final field ENDPOINT_STATUS_PRODUCT_INSTANCE_ID B
668+
public static final field INSTANCE Ldev/atsushieno/ktmidi/ci/MidiCIConstants;
669+
public static final field NO_FUNCTION_BLOCK B
670+
public static final field PROPERTY_EXCHANGE_MAJOR_VERSION B
671+
public static final field PROPERTY_EXCHANGE_MINOR_VERSION B
672+
public static final field STANDARD_DEFINED_PROFILE B
673+
public static final field SYSEX_SUB_ID_MIDI_CI B
674+
public static final field UNIVERSAL_SYSEX B
675+
public static final field WHOLE_FUNCTION_BLOCK B
676+
}
677+
678+
public final class dev/atsushieno/ktmidi/ci/MidiCIConverter {
679+
public static final field INSTANCE Ldev/atsushieno/ktmidi/ci/MidiCIConverter;
680+
public final fun decodeASCIIToString (Ljava/lang/String;)Ljava/lang/String;
681+
public final fun encodeStringToASCII (Ljava/lang/String;)Ljava/lang/String;
682+
}
683+
684+
public final class dev/atsushieno/ktmidi/ci/MidiCIDevice {
685+
public fun <init> (ILdev/atsushieno/ktmidi/ci/MidiCIDeviceConfiguration;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;)V
686+
public final fun addLocalProfile (BLdev/atsushieno/ktmidi/ci/MidiCIProfile;)V
687+
public final fun getConfig ()Ldev/atsushieno/ktmidi/ci/MidiCIDeviceConfiguration;
688+
public final fun getConnections ()Ljava/util/Map;
689+
public final fun getConnectionsChanged ()Ljava/util/List;
690+
public final fun getDevice ()Ldev/atsushieno/ktmidi/ci/MidiCIDeviceInfo;
691+
public final fun getInitiator ()Ldev/atsushieno/ktmidi/ci/PropertyExchangeInitiator;
692+
public final fun getLocalProfiles ()Ldev/atsushieno/ktmidi/ci/ObservableProfileList;
693+
public final fun getLogger ()Ldev/atsushieno/ktmidi/ci/Logger;
694+
public final fun getMessageReceived ()Ljava/util/List;
695+
public final fun getMidiMessageReporter ()Ldev/atsushieno/ktmidi/ci/MidiMessageReporter;
696+
public final fun getMuid ()I
697+
public final fun getOnProfileSet ()Ljava/util/List;
698+
public final fun getRequestIdSerial ()B
699+
public final fun getResponder ()Ldev/atsushieno/ktmidi/ci/PropertyExchangeResponder;
700+
public final fun getUnknownMessageReceived ()Ljava/util/List;
701+
public final fun processInput (BLjava/util/List;)V
702+
public final fun removeLocalProfile (BBLdev/atsushieno/ktmidi/ci/MidiCIProfileId;)V
703+
public final fun requestMidiMessageReport (BBIBBBB)V
704+
public final fun requestProfileDetails (BBILdev/atsushieno/ktmidi/ci/MidiCIProfileId;B)V
705+
public final fun sendDiscovery (B)V
706+
public final fun setMidiMessageReporter (Ldev/atsushieno/ktmidi/ci/MidiMessageReporter;)V
697707
public final fun setRequestIdSerial (B)V
708+
public final fun updateLocalProfileTarget (Ldev/atsushieno/ktmidi/ci/MidiCIProfileId;BBZS)V
698709
}
699710

700711
public final class dev/atsushieno/ktmidi/ci/MidiCIDeviceConfiguration {

0 commit comments

Comments
 (0)