void DeviceTestApp::keyDown( KeyEvent event ) { TextInput *currentSelected = TextInput::getCurrentSelected(); if( ! currentSelected ) return; if( event.getCode() == KeyEvent::KEY_RETURN ) { #if defined( CINDER_COCOA_TOUCH ) hideKeyboard(); #endif try { if( currentSelected == &mSamplerateInput ) { int sr = currentSelected->getValue(); CI_LOG_V( "updating samplerate from: " << mOutputDeviceNode->getSampleRate() << " to: " << sr ); mOutputDeviceNode->getDevice()->updateFormat( audio::Device::Format().sampleRate( sr ) ); } else if( currentSelected == &mFramesPerBlockInput ) { int frames = currentSelected->getValue(); CI_LOG_V( "updating frames per block from: " << mOutputDeviceNode->getFramesPerBlock() << " to: " << frames ); mOutputDeviceNode->getDevice()->updateFormat( audio::Device::Format().framesPerBlock( frames ) ); } else if( currentSelected == &mNumInChannelsInput ) { int numChannels = currentSelected->getValue(); CI_LOG_V( "updating nnm input channels from: " << mInputDeviceNode->getNumChannels() << " to: " << numChannels ); setInputDevice( mInputDeviceNode->getDevice(), numChannels ); } else if( currentSelected == &mNumOutChannelsInput ) { int numChannels = currentSelected->getValue(); CI_LOG_V( "updating nnm output channels from: " << mOutputDeviceNode->getNumChannels() << " to: " << numChannels ); setOutputDevice( mOutputDeviceNode->getDevice(), numChannels ); } else if( currentSelected == &mSendChannelInput ) { if( mTestSelector.currentSection() == "send" || mTestSelector.currentSection() == "send stereo" ) setupTest( mTestSelector.currentSection() ); } else CI_LOG_E( "unhandled return for string: " << currentSelected->mInputString ); } catch( audio::AudioDeviceExc &exc ) { CI_LOG_E( "AudioDeviceExc caught, what: " << exc.what() ); auto ctx = audio::master(); mSamplerateInput.setValue( ctx->getSampleRate() ); mFramesPerBlockInput.setValue( ctx->getFramesPerBlock() ); return; } } else { if( event.getCode() == KeyEvent::KEY_BACKSPACE ) currentSelected->processBackspace(); else { currentSelected->processChar( event.getChar() ); } } }
void DeviceTestApp::printDeviceDetails( const audio::DeviceRef &device ) { console() << "\t name: " << device->getName() << endl; console() << "\t output channels: " << device->getNumOutputChannels() << endl; console() << "\t input channels: " << device->getNumInputChannels() << endl; console() << "\t samplerate: " << device->getSampleRate() << endl; console() << "\t block size: " << device->getFramesPerBlock() << endl; bool isSyncIO = mInputDeviceNode && mOutputDeviceNode && ( mInputDeviceNode->getDevice() == mOutputDeviceNode->getDevice() && ( mInputDeviceNode->getNumChannels() == mOutputDeviceNode->getNumChannels() ) ); console() << "\t sync IO: " << boolalpha << isSyncIO << dec << endl; }
void DeviceTestApp::setupUI() { mInputDeviceNodeUnderrunFade = mInputDeviceNodeOverrunFade = mOutputDeviceNodeClipFade = 0; mViewYOffset = 0; mPlayButton = Button( true, "stopped", "playing" ); mWidgets.push_back( &mPlayButton ); mRecordButton = Button( false, "record" ); mWidgets.push_back( &mRecordButton ); mTestSelector.mSegments.push_back( "sinewave" ); mTestSelector.mSegments.push_back( "noise" ); mTestSelector.mSegments.push_back( "input (pulled)" ); mTestSelector.mSegments.push_back( "I/O (clean)" ); mTestSelector.mSegments.push_back( "I/O (processed)" ); mTestSelector.mSegments.push_back( "I/O and sine" ); mTestSelector.mSegments.push_back( "send" ); mTestSelector.mSegments.push_back( "send stereo" ); mWidgets.push_back( &mTestSelector ); #if defined( CINDER_COCOA_TOUCH ) mPlayButton.mBounds = Rectf( 0, 0, 120, 60 ); mRecordButton.mBounds = Rectf( 130, 0, 190, 34 ); mTestSelector.mBounds = Rectf( getWindowWidth() - 190, 0, getWindowWidth(), 180 ); #else mPlayButton.mBounds = Rectf( 0, 0, 200, 60 ); mRecordButton.mBounds = Rectf( 210, 0, 310, 40 ); mTestSelector.mBounds = Rectf( getWindowCenter().x + 110, 0, (float)getWindowWidth(), 180 ); #endif mGainSlider.mBounds = Rectf( mTestSelector.mBounds.x1, mTestSelector.mBounds.y2 + 10, mTestSelector.mBounds.x2, mTestSelector.mBounds.y2 + 50 ); mGainSlider.mTitle = "GainNode"; mGainSlider.set( mGain->getValue() ); mWidgets.push_back( &mGainSlider ); mOutputSelector.mTitle = "Output Devices"; mOutputSelector.mBounds = Rectf( mTestSelector.mBounds.x1, getWindowCenter().y + 40, (float)getWindowWidth(), (float)getWindowHeight() ); if( mOutputDeviceNode ) { for( const auto &dev : audio::Device::getOutputDevices() ) { if( dev == mOutputDeviceNode->getDevice() ) mOutputSelector.mCurrentSectionIndex = mOutputSelector.mSegments.size(); mOutputSelector.mSegments.push_back( dev->getName() ); } } mWidgets.push_back( &mOutputSelector ); mInputSelector.mTitle = "Input Devices"; mInputSelector.mBounds = mOutputSelector.mBounds - vec2( mOutputSelector.mBounds.getWidth() + 10, 0 ); if( mOutputDeviceNode ) { for( const auto &dev : audio::Device::getInputDevices() ) { if( dev == mInputDeviceNode->getDevice() ) mInputSelector.mCurrentSectionIndex = mInputSelector.mSegments.size(); mInputSelector.mSegments.push_back( dev->getName() ); } } mWidgets.push_back( &mInputSelector ); Rectf textInputBounds( 0, getWindowCenter().y + 40, 200, getWindowCenter().y + 70 ); mSamplerateInput.mBounds = textInputBounds; mSamplerateInput.mTitle = "samplerate"; mSamplerateInput.setValue( audio::master()->getSampleRate() ); mWidgets.push_back( &mSamplerateInput ); textInputBounds += vec2( 0, textInputBounds.getHeight() + 24 ); mFramesPerBlockInput.mBounds = textInputBounds; mFramesPerBlockInput.mTitle = "frames per block"; mFramesPerBlockInput.setValue( audio::master()->getFramesPerBlock() ); mWidgets.push_back( &mFramesPerBlockInput ); textInputBounds += vec2( 0, textInputBounds.getHeight() + 24 ); mNumInChannelsInput.mBounds = textInputBounds; mNumInChannelsInput.mTitle = "num inputs"; if( mInputDeviceNode ) mNumInChannelsInput.setValue( mInputDeviceNode->getNumChannels() ); mWidgets.push_back( &mNumInChannelsInput ); textInputBounds += vec2( 0, textInputBounds.getHeight() + 24 ); mNumOutChannelsInput.mBounds = textInputBounds; mNumOutChannelsInput.mTitle = "num outputs"; if( mOutputDeviceNode ) mNumOutChannelsInput.setValue( mOutputDeviceNode->getNumChannels() ); mWidgets.push_back( &mNumOutChannelsInput ); textInputBounds += vec2( 0, textInputBounds.getHeight() + 24 ); mSendChannelInput.mBounds = textInputBounds; mSendChannelInput.mTitle = "send channel"; mSendChannelInput.setValue( 2 ); mWidgets.push_back( &mSendChannelInput ); vec2 xrunSize( 80, 26 ); mUnderrunRect = Rectf( 0, mPlayButton.mBounds.y2 + 10, xrunSize.x, mPlayButton.mBounds.y2 + xrunSize.y + 10 ); mOverrunRect = mUnderrunRect + vec2( xrunSize.x + 10, 0 ); mClipRect = mOverrunRect + vec2( xrunSize.x + 10, 0 ); getWindow()->getSignalMouseDown().connect( [this] ( MouseEvent &event ) { processTap( event.getPos() ); } ); getWindow()->getSignalMouseDrag().connect( [this] ( MouseEvent &event ) { processDrag( event.getPos() ); } ); getWindow()->getSignalTouchesBegan().connect( [this] ( TouchEvent &event ) { processTap( event.getTouches().front().getPos() ); } ); getWindow()->getSignalTouchesMoved().connect( [this] ( TouchEvent &event ) { for( const TouchEvent::Touch &touch : getActiveTouches() ) processDrag( touch.getPos() ); } ); #if defined( CINDER_COCOA_TOUCH ) getSignalKeyboardWillShow().connect( [this] { timeline().apply( &mViewYOffset, -100.0f, 0.3f, EaseInOutCubic() ); } ); getSignalKeyboardWillHide().connect( [this] { timeline().apply( &mViewYOffset, 0.0f, 0.3f, EaseInOutCubic() ); } ); #endif gl::enableAlphaBlending(); }