diff options
Diffstat (limited to 'chromium/media/midi/midi_manager_mac.cc')
-rw-r--r-- | chromium/media/midi/midi_manager_mac.cc | 63 |
1 files changed, 53 insertions, 10 deletions
diff --git a/chromium/media/midi/midi_manager_mac.cc b/chromium/media/midi/midi_manager_mac.cc index 4477944e773..a36d1debe13 100644 --- a/chromium/media/midi/midi_manager_mac.cc +++ b/chromium/media/midi/midi_manager_mac.cc @@ -4,12 +4,13 @@ #include "media/midi/midi_manager_mac.h" -#include <iostream> #include <string> #include "base/debug/trace_event.h" +#include "base/message_loop/message_loop.h" #include "base/strings/string_number_conversions.h" #include "base/strings/sys_string_conversions.h" + #include <CoreAudio/HostTime.h> using base::IntToString; @@ -31,7 +32,8 @@ MIDIManagerMac::MIDIManagerMac() coremidi_input_(0), coremidi_output_(0), packet_list_(NULL), - midi_packet_(NULL) { + midi_packet_(NULL), + send_thread_("MIDISendThread") { } bool MIDIManagerMac::Initialize() { @@ -103,13 +105,31 @@ bool MIDIManagerMac::Initialize() { return true; } +void MIDIManagerMac::DispatchSendMIDIData(MIDIManagerClient* client, + uint32 port_index, + const std::vector<uint8>& data, + double timestamp) { + if (!send_thread_.IsRunning()) + send_thread_.Start(); + + // OK to use base::Unretained(this) since we join to thread in dtor(). + send_thread_.message_loop()->PostTask( + FROM_HERE, + base::Bind(&MIDIManagerMac::SendMIDIData, base::Unretained(this), + client, port_index, data, timestamp)); +} + MIDIManagerMac::~MIDIManagerMac() { + // Wait for the termination of |send_thread_| before disposing MIDI ports. + send_thread_.Stop(); + if (coremidi_input_) MIDIPortDispose(coremidi_input_); if (coremidi_output_) MIDIPortDispose(coremidi_output_); } +// static void MIDIManagerMac::ReadMIDIDispatch(const MIDIPacketList* packet_list, void* read_proc_refcon, void* src_conn_refcon) { @@ -133,7 +153,7 @@ void MIDIManagerMac::ReadMIDI(MIDIEndpointRef source, uint32 port_index = source_map_[source]; // Go through each packet and process separately. - for(size_t i = 0; i < packet_list->numPackets; i++) { + for (size_t i = 0; i < packet_list->numPackets; i++) { // Each packet contains MIDI data for one or more messages (like note-on). const MIDIPacket &packet = packet_list->packet[i]; double timestamp_seconds = MIDITimeStampToSeconds(packet.timeStamp); @@ -150,7 +170,7 @@ void MIDIManagerMac::SendMIDIData(MIDIManagerClient* client, uint32 port_index, const std::vector<uint8>& data, double timestamp) { - DCHECK(CurrentlyOnMIDISendThread()); + DCHECK(send_thread_.message_loop_proxy()->BelongsToCurrentThread()); // System Exclusive has already been filtered. MIDITimeStamp coremidi_timestamp = SecondsToMIDITimeStamp(timestamp); @@ -177,34 +197,57 @@ void MIDIManagerMac::SendMIDIData(MIDIManagerClient* client, client->AccumulateMIDIBytesSent(data.size()); } +// static MIDIPortInfo MIDIManagerMac::GetPortInfoFromEndpoint( MIDIEndpointRef endpoint) { SInt32 id_number = 0; MIDIObjectGetIntegerProperty(endpoint, kMIDIPropertyUniqueID, &id_number); string id = IntToString(id_number); + string manufacturer; CFStringRef manufacturer_ref = NULL; - MIDIObjectGetStringProperty( + OSStatus result = MIDIObjectGetStringProperty( endpoint, kMIDIPropertyManufacturer, &manufacturer_ref); - string manufacturer = SysCFStringRefToUTF8(manufacturer_ref); + if (result == noErr) { + manufacturer = SysCFStringRefToUTF8(manufacturer_ref); + } else { + // kMIDIPropertyManufacturer is not supported in IAC driver providing + // endpoints, and the result will be kMIDIUnknownProperty (-10835). + DLOG(WARNING) << "Failed to get kMIDIPropertyManufacturer with status " + << result; + } + string name; CFStringRef name_ref = NULL; - MIDIObjectGetStringProperty(endpoint, kMIDIPropertyName, &name_ref); - string name = SysCFStringRefToUTF8(name_ref); + result = MIDIObjectGetStringProperty(endpoint, kMIDIPropertyName, &name_ref); + if (result == noErr) + name = SysCFStringRefToUTF8(name_ref); + else + DLOG(WARNING) << "Failed to get kMIDIPropertyName with status " << result; + string version; SInt32 version_number = 0; - MIDIObjectGetIntegerProperty( + result = MIDIObjectGetIntegerProperty( endpoint, kMIDIPropertyDriverVersion, &version_number); - string version = IntToString(version_number); + if (result == noErr) { + version = IntToString(version_number); + } else { + // kMIDIPropertyDriverVersion is not supported in IAC driver providing + // endpoints, and the result will be kMIDIUnknownProperty (-10835). + DLOG(WARNING) << "Failed to get kMIDIPropertyDriverVersion with status " + << result; + } return MIDIPortInfo(id, manufacturer, name, version); } +// static double MIDIManagerMac::MIDITimeStampToSeconds(MIDITimeStamp timestamp) { UInt64 nanoseconds = AudioConvertHostTimeToNanos(timestamp); return static_cast<double>(nanoseconds) / 1.0e9; } +// static MIDITimeStamp MIDIManagerMac::SecondsToMIDITimeStamp(double seconds) { UInt64 nanos = UInt64(seconds * 1.0e9); return AudioConvertNanosToHostTime(nanos); |