00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <sstream>
00021 #include <stdexcept>
00022
00023 #include "JackCoreMidiUtil.h"
00024 #include "JackCoreMidiVirtualInputPort.h"
00025
00026 using Jack::JackCoreMidiVirtualInputPort;
00027
00029
00031
00032 void
00033 JackCoreMidiVirtualInputPort::
00034 HandleInputEvent(const MIDIPacketList *packet_list, void *port,
00035 void *)
00036 {
00037 ((JackCoreMidiVirtualInputPort *) port)->ProcessCoreMidi(packet_list);
00038 }
00039
00041
00043
00044 JackCoreMidiVirtualInputPort::
00045 JackCoreMidiVirtualInputPort(const char *alias_name, const char *client_name,
00046 const char *driver_name, int index,
00047 MIDIClientRef client, double time_ratio,
00048 size_t max_bytes, size_t max_messages):
00049 JackCoreMidiInputPort(time_ratio, max_bytes, max_messages)
00050 {
00051 std::stringstream stream;
00052 stream << "virtual" << (index + 1);
00053 CFStringRef name = CFStringCreateWithCString(0, stream.str().c_str(),
00054 CFStringGetSystemEncoding());
00055 if (! name) {
00056 throw std::bad_alloc();
00057 }
00058 MIDIEndpointRef destination;
00059 OSStatus status = MIDIDestinationCreate(client, name, HandleInputEvent,
00060 this, &destination);
00061 CFRelease(name);
00062 if (status != noErr) {
00063 throw std::runtime_error(GetMacOSErrorString(status));
00064 }
00065 Initialize(alias_name, client_name, driver_name, index, destination);
00066 }
00067
00068 JackCoreMidiVirtualInputPort::~JackCoreMidiVirtualInputPort()
00069 {
00070 OSStatus status = MIDIEndpointDispose(GetEndpoint());
00071 if (status != noErr) {
00072 WriteMacOSError("JackCoreMidiVirtualInputPort [destructor]",
00073 "MIDIEndpointDispose", status);
00074 }
00075 }