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

View File

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

View File

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