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