CoreMidi API usage adjustment to prefer latest connected HW

This commit is contained in:
Jack Andersen 2016-10-15 08:39:09 -10:00
parent 1877c546ac
commit d5b42b785e
3 changed files with 76 additions and 53 deletions

View File

@ -122,27 +122,32 @@ struct AQSAudioVoiceEngine : BaseAudioVoiceEngine
ItemCount numDevices = MIDIGetNumberOfDevices(); ItemCount numDevices = MIDIGetNumberOfDevices();
ret.reserve(numDevices); ret.reserve(numDevices);
for (ItemCount i=0 ; i<numDevices ; ++i) for (int i=int(numDevices)-1 ; i>=0 ; --i)
{ {
MIDIDeviceRef dev = MIDIGetDevice(i); MIDIDeviceRef dev = MIDIGetDevice(i);
if (!dev) if (!dev)
continue; continue;
CFStringRef idstr; SInt32 idNum;
if (MIDIObjectGetStringProperty(dev, kMIDIPropertyDeviceID, &idstr)) if (MIDIObjectGetIntegerProperty(dev, kMIDIPropertyUniqueID, &idNum))
continue; continue;
CFStringRef namestr; CFStringRef namestr;
if (MIDIObjectGetStringProperty(dev, kMIDIPropertyDisplayName, &namestr)) const char* nameCstr;
if (MIDIObjectGetStringProperty(dev, kMIDIPropertyName, &namestr))
continue;
if (!(nameCstr = CFStringGetCStringPtr(namestr, kCFStringEncodingUTF8)))
{ {
CFRelease(idstr); CFRelease(namestr);
continue; continue;
} }
ret.push_back(std::make_pair(std::string(CFStringGetCStringPtr(idstr, kCFStringEncodingUTF8)), char idStr[9];
std::string(CFStringGetCStringPtr(namestr, kCFStringEncodingUTF8)))); snprintf(idStr, 9, "%08X\n", idNum);
ret.push_back(std::make_pair(std::string(idStr),
std::string(nameCstr)));
CFRelease(idstr);
CFRelease(namestr); CFRelease(namestr);
} }
@ -158,16 +163,16 @@ struct AQSAudioVoiceEngine : BaseAudioVoiceEngine
if (!dev) if (!dev)
continue; continue;
CFStringRef idstr; SInt32 idNum;
if (MIDIObjectGetStringProperty(dev, kMIDIPropertyDeviceID, &idstr)) if (MIDIObjectGetIntegerProperty(dev, kMIDIPropertyUniqueID, &idNum))
continue; continue;
if (!strcmp(CFStringGetCStringPtr(idstr, kCFStringEncodingUTF8), name)) char idStr[9];
{ snprintf(idStr, 9, "%08X\n", idNum);
CFRelease(idstr); if (strcmp(idStr, name))
return dev; continue;
}
CFRelease(idstr); return dev;
} }
return {}; return {};
@ -256,12 +261,18 @@ struct AQSAudioVoiceEngine : BaseAudioVoiceEngine
std::string description() const std::string description() const
{ {
CFStringRef namestr; CFStringRef namestr;
if (MIDIObjectGetStringProperty(m_midi, kMIDIPropertyDisplayName, &namestr)) const char* nameCstr;
if (MIDIObjectGetStringProperty(m_midi, kMIDIPropertyName, &namestr))
return {}; return {};
std::string ret(CFStringGetCStringPtr(namestr, kCFStringEncodingUTF8)); if (!(nameCstr = CFStringGetCStringPtr(namestr, kCFStringEncodingUTF8)))
{
CFRelease(namestr);
return {};
}
CFRelease(namestr); CFRelease(namestr);
return ret; return nameCstr;
} }
}; };
@ -284,12 +295,18 @@ struct AQSAudioVoiceEngine : BaseAudioVoiceEngine
std::string description() const std::string description() const
{ {
CFStringRef namestr; CFStringRef namestr;
if (MIDIObjectGetStringProperty(m_midi, kMIDIPropertyDisplayName, &namestr)) const char* nameCstr;
if (MIDIObjectGetStringProperty(m_midi, kMIDIPropertyName, &namestr))
return {}; return {};
std::string ret(CFStringGetCStringPtr(namestr, kCFStringEncodingUTF8)); if (!(nameCstr = CFStringGetCStringPtr(namestr, kCFStringEncodingUTF8)))
{
CFRelease(namestr);
return {};
}
CFRelease(namestr); CFRelease(namestr);
return ret; return nameCstr;
} }
size_t send(const void* buf, size_t len) const size_t send(const void* buf, size_t len) const
@ -338,12 +355,18 @@ struct AQSAudioVoiceEngine : BaseAudioVoiceEngine
std::string description() const std::string description() const
{ {
CFStringRef namestr; CFStringRef namestr;
if (MIDIObjectGetStringProperty(m_midiIn, kMIDIPropertyDisplayName, &namestr)) const char* nameCstr;
if (MIDIObjectGetStringProperty(m_midiIn, kMIDIPropertyName, &namestr))
return {}; return {};
std::string ret(CFStringGetCStringPtr(namestr, kCFStringEncodingUTF8)); if (!(nameCstr = CFStringGetCStringPtr(namestr, kCFStringEncodingUTF8)))
{
CFRelease(namestr);
return {};
}
CFRelease(namestr); CFRelease(namestr);
return ret; return nameCstr;
} }
size_t send(const void* buf, size_t len) const size_t send(const void* buf, size_t len) const
@ -534,7 +557,7 @@ struct AQSAudioVoiceEngine : BaseAudioVoiceEngine
return ret; return ret;
} }
bool useMIDILock() const {return true;} bool useMIDILock() const {return true;}
AQSAudioVoiceEngine() AQSAudioVoiceEngine()
@ -559,7 +582,7 @@ struct AQSAudioVoiceEngine : BaseAudioVoiceEngine
Log.report(logvisor::Fatal, "unable to create output audio queue"); Log.report(logvisor::Fatal, "unable to create output audio queue");
return; return;
} }
Float64 actualSampleRate; Float64 actualSampleRate;
UInt32 argSize = 8; UInt32 argSize = 8;
err = AudioQueueGetProperty(m_queue, kAudioQueueDeviceProperty_SampleRate, &actualSampleRate, &argSize); err = AudioQueueGetProperty(m_queue, kAudioQueueDeviceProperty_SampleRate, &actualSampleRate, &argSize);
@ -569,7 +592,7 @@ struct AQSAudioVoiceEngine : BaseAudioVoiceEngine
Log.report(logvisor::Fatal, "unable to get native sample rate from audio queue"); Log.report(logvisor::Fatal, "unable to get native sample rate from audio queue");
return; return;
} }
desc.mSampleRate = actualSampleRate; desc.mSampleRate = actualSampleRate;
if ((err = AudioQueueNewOutput(&desc, AudioQueueOutputCallback(Callback), if ((err = AudioQueueNewOutput(&desc, AudioQueueOutputCallback(Callback),
this, nullptr, nullptr, 0, &m_queue))) this, nullptr, nullptr, 0, &m_queue)))

View File

@ -74,12 +74,12 @@ public:
NSMenuItem* fsItem = [appMenu addItemWithTitle:@"Toggle Full Screen" NSMenuItem* fsItem = [appMenu addItemWithTitle:@"Toggle Full Screen"
action:@selector(toggleFs:) action:@selector(toggleFs:)
keyEquivalent:@"f"]; keyEquivalent:@"f"];
[fsItem setKeyEquivalentModifierMask:NSCommandKeyMask]; [fsItem setKeyEquivalentModifierMask:NSEventModifierFlagCommand];
[appMenu addItem:[NSMenuItem separatorItem]]; [appMenu addItem:[NSMenuItem separatorItem]];
NSMenuItem* quitItem = [appMenu addItemWithTitle:[NSString stringWithFormat:@"Quit %s", m_friendlyName.c_str()] NSMenuItem* quitItem = [appMenu addItemWithTitle:[NSString stringWithFormat:@"Quit %s", m_friendlyName.c_str()]
action:@selector(quitApp:) action:@selector(quitApp:)
keyEquivalent:@"q"]; keyEquivalent:@"q"];
[quitItem setKeyEquivalentModifierMask:NSCommandKeyMask]; [quitItem setKeyEquivalentModifierMask:NSEventModifierFlagCommand];
[[rootMenu addItemWithTitle:[NSString stringWithUTF8String:m_friendlyName.c_str()] [[rootMenu addItemWithTitle:[NSString stringWithUTF8String:m_friendlyName.c_str()]
action:nil keyEquivalent:@""] setSubmenu:appMenu]; action:nil keyEquivalent:@""] setSubmenu:appMenu];
[[NSApplication sharedApplication] setMainMenu:rootMenu]; [[NSApplication sharedApplication] setMainMenu:rootMenu];

View File

@ -617,13 +617,13 @@ IGraphicsContext* _GraphicsContextCocoaMetalNew(IGraphicsContext::EGraphicsAPI a
static inline boo::EModifierKey getMod(NSUInteger flags) static inline boo::EModifierKey getMod(NSUInteger flags)
{ {
boo::EModifierKey ret = boo::EModifierKey::None; boo::EModifierKey ret = boo::EModifierKey::None;
if (flags & NSControlKeyMask) if (flags & NSEventModifierFlagControl)
ret |= boo::EModifierKey::Ctrl; ret |= boo::EModifierKey::Ctrl;
if (flags & NSAlternateKeyMask) if (flags & NSEventModifierFlagOption)
ret |= boo::EModifierKey::Alt; ret |= boo::EModifierKey::Alt;
if (flags & NSShiftKeyMask) if (flags & NSEventModifierFlagShift)
ret |= boo::EModifierKey::Shift; ret |= boo::EModifierKey::Shift;
if (flags & NSCommandKeyMask) if (flags & NSEventModifierFlagCommand)
ret |= boo::EModifierKey::Command; ret |= boo::EModifierKey::Command;
return ret; return ret;
} }
@ -1061,23 +1061,23 @@ static boo::ESpecialKey translateKeycode(short code)
NSUInteger changedFlags = modFlags ^ lastModifiers; NSUInteger changedFlags = modFlags ^ lastModifiers;
NSUInteger downFlags = changedFlags & modFlags; NSUInteger downFlags = changedFlags & modFlags;
if (downFlags & NSControlKeyMask) if (downFlags & NSEventModifierFlagControl)
booContext->m_callback->modKeyDown(boo::EModifierKey::Ctrl, false); booContext->m_callback->modKeyDown(boo::EModifierKey::Ctrl, false);
if (downFlags & NSAlternateKeyMask) if (downFlags & NSEventModifierFlagOption)
booContext->m_callback->modKeyDown(boo::EModifierKey::Alt, false); booContext->m_callback->modKeyDown(boo::EModifierKey::Alt, false);
if (downFlags & NSShiftKeyMask) if (downFlags & NSEventModifierFlagShift)
booContext->m_callback->modKeyDown(boo::EModifierKey::Shift, false); booContext->m_callback->modKeyDown(boo::EModifierKey::Shift, false);
if (downFlags & NSCommandKeyMask) if (downFlags & NSEventModifierFlagCommand)
booContext->m_callback->modKeyDown(boo::EModifierKey::Command, false); booContext->m_callback->modKeyDown(boo::EModifierKey::Command, false);
NSUInteger upFlags = changedFlags & ~modFlags; NSUInteger upFlags = changedFlags & ~modFlags;
if (upFlags & NSControlKeyMask) if (upFlags & NSEventModifierFlagControl)
booContext->m_callback->modKeyUp(boo::EModifierKey::Ctrl); booContext->m_callback->modKeyUp(boo::EModifierKey::Ctrl);
if (upFlags & NSAlternateKeyMask) if (upFlags & NSEventModifierFlagOption)
booContext->m_callback->modKeyUp(boo::EModifierKey::Alt); booContext->m_callback->modKeyUp(boo::EModifierKey::Alt);
if (upFlags & NSShiftKeyMask) if (upFlags & NSEventModifierFlagShift)
booContext->m_callback->modKeyUp(boo::EModifierKey::Shift); booContext->m_callback->modKeyUp(boo::EModifierKey::Shift);
if (upFlags & NSCommandKeyMask) if (upFlags & NSEventModifierFlagCommand)
booContext->m_callback->modKeyUp(boo::EModifierKey::Command); booContext->m_callback->modKeyUp(boo::EModifierKey::Command);
lastModifiers = modFlags; lastModifiers = modFlags;
@ -1392,7 +1392,7 @@ public:
bool isFullscreen() const bool isFullscreen() const
{ {
return ([m_nsWindow styleMask] & NSFullScreenWindowMask) == NSFullScreenWindowMask; return ([m_nsWindow styleMask] & NSWindowStyleMaskFullScreen) == NSWindowStyleMaskFullScreen;
} }
void setFullscreen(bool fs) void setFullscreen(bool fs)
@ -1455,14 +1455,14 @@ public:
#endif #endif
if ((style & EWindowStyle::Close) != EWindowStyle::None) if ((style & EWindowStyle::Close) != EWindowStyle::None)
m_nsWindow.styleMask |= NSClosableWindowMask; m_nsWindow.styleMask |= NSWindowStyleMaskClosable;
else else
m_nsWindow.styleMask &= ~NSClosableWindowMask; m_nsWindow.styleMask &= ~NSWindowStyleMaskClosable;
if ((style & EWindowStyle::Resize) != EWindowStyle::None) if ((style & EWindowStyle::Resize) != EWindowStyle::None)
m_nsWindow.styleMask |= NSResizableWindowMask; m_nsWindow.styleMask |= NSWindowStyleMaskResizable;
else else
m_nsWindow.styleMask &= ~NSResizableWindowMask; m_nsWindow.styleMask &= ~NSWindowStyleMaskResizable;
} }
EWindowStyle getStyle() const EWindowStyle getStyle() const
@ -1473,8 +1473,8 @@ public:
#else #else
retval |= EWindowStyle::Titlebar; retval |= EWindowStyle::Titlebar;
#endif #endif
retval |= (m_nsWindow.styleMask & NSClosableWindowMask) ? EWindowStyle::Close : EWindowStyle::None; retval |= (m_nsWindow.styleMask & NSWindowStyleMaskClosable) ? EWindowStyle::Close : EWindowStyle::None;
retval |= (m_nsWindow.styleMask & NSResizableWindowMask) ? EWindowStyle::Resize: EWindowStyle::None; retval |= (m_nsWindow.styleMask & NSWindowStyleMaskResizable) ? EWindowStyle::Resize: EWindowStyle::None;
return retval; return retval;
} }
@ -1522,10 +1522,10 @@ IWindow* _WindowCocoaNew(const SystemString& title, NSOpenGLContext* lastGLCtx,
- (id)initWithBooWindow:(boo::WindowCocoa *)bw title:(const boo::SystemString&)title - (id)initWithBooWindow:(boo::WindowCocoa *)bw title:(const boo::SystemString&)title
{ {
self = [self initWithContentRect:[self genFrameDefault] self = [self initWithContentRect:[self genFrameDefault]
styleMask:NSTitledWindowMask| styleMask:NSWindowStyleMaskTitled|
NSClosableWindowMask| NSWindowStyleMaskClosable|
NSMiniaturizableWindowMask| NSWindowStyleMaskMiniaturizable|
NSResizableWindowMask NSWindowStyleMaskTitled
backing:NSBackingStoreBuffered backing:NSBackingStoreBuffered
defer:YES]; defer:YES];
self.releasedWhenClosed = NO; self.releasedWhenClosed = NO;