Index: trunk/src/media/midi/midi_manager_mac.cc |
=================================================================== |
--- trunk/src/media/midi/midi_manager_mac.cc (revision 207994) |
+++ trunk/src/media/midi/midi_manager_mac.cc (working copy) |
@@ -1,205 +0,0 @@ |
-// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "media/midi/midi_manager_mac.h" |
- |
-#include <iostream> |
-#include <string> |
- |
-#include "base/debug/trace_event.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/sys_string_conversions.h" |
-#include <CoreAudio/HostTime.h> |
- |
-using base::IntToString; |
-using base::SysCFStringRefToUTF8; |
-using std::string; |
- |
-namespace media { |
- |
-MIDIManager* MIDIManager::Create() { |
- return new MIDIManagerMac(); |
-} |
- |
-MIDIManagerMac::MIDIManagerMac() |
- : midi_client_(NULL), |
- coremidi_input_(NULL), |
- coremidi_output_(NULL), |
- packet_list_(NULL), |
- midi_packet_(NULL) { |
-} |
- |
-bool MIDIManagerMac::Initialize() { |
- TRACE_EVENT0("midi", "MIDIManagerMac::Initialize"); |
- |
- // CoreMIDI registration. |
- midi_client_ = NULL; |
- OSStatus result = MIDIClientCreate( |
- CFSTR("Google Chrome"), |
- NULL, |
- NULL, |
- &midi_client_); |
- |
- if (result != noErr) |
- return false; |
- |
- coremidi_input_ = NULL; |
- |
- // Create input and output port. |
- result = MIDIInputPortCreate( |
- midi_client_, |
- CFSTR("MIDI Input"), |
- ReadMidiDispatch, |
- this, |
- &coremidi_input_); |
- if (result != noErr) |
- return false; |
- |
- result = MIDIOutputPortCreate( |
- midi_client_, |
- CFSTR("MIDI Output"), |
- &coremidi_output_); |
- if (result != noErr) |
- return false; |
- |
- int destination_count = MIDIGetNumberOfDestinations(); |
- destinations_.reserve(destination_count); |
- |
- for (int i = 0; i < destination_count ; i++) { |
- MIDIEndpointRef destination = MIDIGetDestination(i); |
- |
- // Keep track of all destinations (known as outputs by the Web MIDI API). |
- // Cache to avoid any possible overhead in calling MIDIGetDestination(). |
- destinations_[i] = destination; |
- |
- MIDIPortInfo info = GetPortInfoFromEndpoint(destination); |
- AddOutputPort(info); |
- } |
- |
- // Open connections from all sources. |
- int source_count = MIDIGetNumberOfSources(); |
- |
- for (int i = 0; i < source_count; ++i) { |
- // Receive from all sources. |
- MIDIEndpointRef src = MIDIGetSource(i); |
- MIDIPortConnectSource(coremidi_input_, src, src); |
- |
- // Keep track of all sources (known as inputs in Web MIDI API terminology). |
- source_map_[src] = i; |
- |
- MIDIPortInfo info = GetPortInfoFromEndpoint(src); |
- AddInputPort(info); |
- } |
- |
- // TODO(crogers): Fix the memory management here! |
- packet_list_ = reinterpret_cast<MIDIPacketList*>(midi_buffer_); |
- midi_packet_ = MIDIPacketListInit(packet_list_); |
- |
- return true; |
-} |
- |
-MIDIManagerMac::~MIDIManagerMac() { |
- if (coremidi_input_) |
- MIDIPortDispose(coremidi_input_); |
- if (coremidi_output_) |
- MIDIPortDispose(coremidi_output_); |
-} |
- |
-void MIDIManagerMac::ReadMidiDispatch(const MIDIPacketList* packet_list, |
- void* read_proc_refcon, |
- void* src_conn_refcon) { |
- MIDIManagerMac* manager = static_cast<MIDIManagerMac*>(read_proc_refcon); |
- MIDIEndpointRef source = static_cast<MIDIEndpointRef>(src_conn_refcon); |
- |
- // Dispatch to class method. |
- manager->ReadMidi(source, packet_list); |
-} |
- |
-void MIDIManagerMac::ReadMidi(MIDIEndpointRef source, |
- const MIDIPacketList* packet_list) { |
- // Lookup the port index based on the source. |
- SourceMap::iterator j = source_map_.find(source); |
- if (j == source_map_.end()) |
- return; |
- int port_index = source_map_[source]; |
- |
- // Go through each packet and process separately. |
- 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); |
- |
- ReceiveMIDIData( |
- port_index, |
- packet.data, |
- packet.length, |
- timestamp_seconds); |
- } |
-} |
- |
-void MIDIManagerMac::SendMIDIData(int port_index, |
- const uint8* data, |
- size_t length, |
- double timestamp) { |
- // TODO(crogers): Filter out sysex. |
- |
- MIDITimeStamp coremidi_timestamp = SecondsToMIDITimeStamp(timestamp); |
- |
- midi_packet_ = MIDIPacketListAdd( |
- packet_list_, |
- kMaxPacketListSize, |
- midi_packet_, |
- coremidi_timestamp, |
- length, |
- data); |
- |
- // Lookup the destination based on the port index. |
- // TODO(crogers): re-factor |port_index| to use unsigned |
- // to avoid the need for this check. |
- if (port_index < 0 || |
- static_cast<size_t>(port_index) >= destinations_.size()) |
- return; |
- |
- MIDIEndpointRef destination = destinations_[port_index]; |
- |
- MIDISend(coremidi_output_, destination, packet_list_); |
- |
- // Re-initialize for next time. |
- midi_packet_ = MIDIPacketListInit(packet_list_); |
-} |
- |
-MIDIPortInfo MIDIManagerMac::GetPortInfoFromEndpoint( |
- MIDIEndpointRef endpoint) { |
- SInt32 id_number = 0; |
- MIDIObjectGetIntegerProperty(endpoint, kMIDIPropertyUniqueID, &id_number); |
- string id = IntToString(id_number); |
- |
- CFStringRef manufacturer_ref = NULL; |
- MIDIObjectGetStringProperty( |
- endpoint, kMIDIPropertyManufacturer, &manufacturer_ref); |
- string manufacturer = SysCFStringRefToUTF8(manufacturer_ref); |
- |
- CFStringRef name_ref = NULL; |
- MIDIObjectGetStringProperty(endpoint, kMIDIPropertyName, &name_ref); |
- string name = SysCFStringRefToUTF8(name_ref); |
- |
- SInt32 version_number = 0; |
- MIDIObjectGetIntegerProperty( |
- endpoint, kMIDIPropertyDriverVersion, &version_number); |
- string version = IntToString(version_number); |
- |
- return MIDIPortInfo(id, manufacturer, name, version); |
-} |
- |
-double MIDIManagerMac::MIDITimeStampToSeconds(MIDITimeStamp timestamp) { |
- UInt64 nanoseconds = AudioConvertHostTimeToNanos(timestamp); |
- return static_cast<double>(nanoseconds) / 1.0e9; |
-} |
- |
-MIDITimeStamp MIDIManagerMac::SecondsToMIDITimeStamp(double seconds) { |
- UInt64 nanos = UInt64(seconds * 1.0e9); |
- return AudioConvertNanosToHostTime(nanos); |
-} |
- |
-} // namespace media |