Jack2  1.9.10
JackCoreMidiVirtualOutputPort.cpp
1 /*
2 Copyright (C) 2011 Devin Anderson
3 
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
8 
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13 
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 
18 */
19 
20 #include <sstream>
21 #include <stdexcept>
22 
23 #include "JackError.h"
24 #include "JackCoreMidiUtil.h"
25 #include "JackCoreMidiVirtualOutputPort.h"
26 
28 
29 JackCoreMidiVirtualOutputPort::
30 JackCoreMidiVirtualOutputPort(const char *alias_name, const char *client_name,
31  const char *driver_name, int base_index, int index,
32  MIDIClientRef client, double time_ratio,
33  size_t max_bytes,
34  size_t max_messages):
35  JackCoreMidiOutputPort(time_ratio, max_bytes,
36  max_messages)
37 {
38  std::stringstream stream;
39  stream << "virtual" << (base_index + 1);
40  CFStringRef name = CFStringCreateWithCString(0, stream.str().c_str(),
41  CFStringGetSystemEncoding());
42  if (! name) {
43  throw std::bad_alloc();
44  }
45  MIDIEndpointRef source;
46  OSStatus status = MIDISourceCreate(client, name, &source);
47 
48  /*
49  SInt32 value;
50  status = MIDIObjectGetIntegerProperty(source, kMIDIPropertyUniqueID, &value);
51  if (status == noErr) {
52  jack_info("kMIDIPropertyUniqueID %d", value);
53  }
54  */
55 
56  CFRelease(name);
57  if (status != noErr) {
58  throw std::runtime_error(GetMacOSErrorString(status));
59  }
60  Initialize(alias_name, client_name, driver_name, index, source, 0);
61 
62  // Keep in global list (that keeps growing during the whole session...)
63  endpoint_list.insert(GetEndpoint());
64 }
65 
66 JackCoreMidiVirtualOutputPort::~JackCoreMidiVirtualOutputPort()
67 {
68  OSStatus status = MIDIEndpointDispose(GetEndpoint());
69  if (status != noErr) {
70  WriteMacOSError("JackCoreMidiVirtualOutputPort [destructor]",
71  "MIDIEndpointDispose", status);
72  }
73 }
74 
75 bool
76 JackCoreMidiVirtualOutputPort::SendPacketList(MIDIPacketList *packet_list)
77 {
78  OSStatus status = MIDIReceived(endpoint, packet_list);
79  bool result = status == noErr;
80  if (! result) {
81  WriteMacOSError("JackCoreMidiVirtualOutputPort::SendPacketList",
82  "MIDIReceived", status);
83  }
84  return result;
85 }