summaryrefslogtreecommitdiff
path: root/chromium/media/midi/midi_manager_mac.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/media/midi/midi_manager_mac.cc')
-rw-r--r--chromium/media/midi/midi_manager_mac.cc63
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);