1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "media/midi/midi_manager.h"
8 #include "base/bind_helpers.h"
9 #include "base/message_loop/message_loop.h"
10 #include "base/threading/thread.h"
14 #if !defined(OS_MACOSX)
15 // TODO(crogers): implement MIDIManager for other platforms.
16 MIDIManager* MIDIManager::Create() {
21 MIDIManager::MIDIManager()
22 : initialized_(false) {
25 MIDIManager::~MIDIManager() {}
27 bool MIDIManager::StartSession(MIDIManagerClient* client) {
28 // Lazily initialize the MIDI back-end.
30 initialized_ = Initialize();
33 base::AutoLock auto_lock(clients_lock_);
34 clients_.insert(client);
40 void MIDIManager::EndSession(MIDIManagerClient* client) {
41 base::AutoLock auto_lock(clients_lock_);
42 ClientList::iterator i = clients_.find(client);
43 if (i != clients_.end())
47 void MIDIManager::AddInputPort(const MIDIPortInfo& info) {
48 input_ports_.push_back(info);
51 void MIDIManager::AddOutputPort(const MIDIPortInfo& info) {
52 output_ports_.push_back(info);
55 void MIDIManager::ReceiveMIDIData(
60 base::AutoLock auto_lock(clients_lock_);
62 for (ClientList::iterator i = clients_.begin(); i != clients_.end(); ++i)
63 (*i)->ReceiveMIDIData(port_index, data, length, timestamp);
66 bool MIDIManager::CurrentlyOnMIDISendThread() {
67 return send_thread_->message_loop() == base::MessageLoop::current();
70 void MIDIManager::DispatchSendMIDIData(MIDIManagerClient* client,
72 const std::vector<uint8>& data,
74 // Lazily create the thread when first needed.
76 send_thread_.reset(new base::Thread("MIDISendThread"));
77 send_thread_->Start();
78 send_message_loop_ = send_thread_->message_loop_proxy();
81 send_message_loop_->PostTask(
83 base::Bind(&MIDIManager::SendMIDIData, base::Unretained(this),
84 client, port_index, data, timestamp));