diff options
Diffstat (limited to 'media/midi/midi_manager_mac.cc')
-rw-r--r-- | media/midi/midi_manager_mac.cc | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/media/midi/midi_manager_mac.cc b/media/midi/midi_manager_mac.cc index 0294024..8fd0065 100644 --- a/media/midi/midi_manager_mac.cc +++ b/media/midi/midi_manager_mac.cc @@ -7,8 +7,10 @@ #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; @@ -30,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() { @@ -102,7 +105,24 @@ 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_) @@ -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); |