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::processTap( ivec2 pos ) { // TextInput *selectedInput = false; if( mPlayButton.hitTest( pos ) ) audio::master()->setEnabled( ! audio::master()->isEnabled() ); else if( mRecordButton.hitTest( pos ) ) startRecording(); else if( mSamplerateInput.hitTest( pos ) ) { } else if( mFramesPerBlockInput.hitTest( pos ) ) { } else if( mNumInChannelsInput.hitTest( pos ) ) { } else if( mNumOutChannelsInput.hitTest( pos ) ) { } else if( mSendChannelInput.hitTest( pos ) ) { } #if defined( CINDER_COCOA_TOUCH ) TextInput *currentSelected = TextInput::getCurrentSelected(); if( currentSelected ) showKeyboard( KeyboardOptions().type( KeyboardType::NUMERICAL ).initialString( currentSelected->mInputString ) ); #endif size_t currentTestIndex = mTestSelector.mCurrentSectionIndex; if( mTestSelector.hitTest( pos ) && currentTestIndex != mTestSelector.mCurrentSectionIndex ) { string currentTest = mTestSelector.currentSection(); CI_LOG_V( "selected: " << currentTest ); setupTest( currentTest ); return; } size_t currentOutputIndex = mOutputSelector.mCurrentSectionIndex; if( mOutputSelector.hitTest( pos ) && currentOutputIndex != mOutputSelector.mCurrentSectionIndex ) { auto dev = audio::Device::findDeviceByName( mOutputSelector.mSegments[mOutputSelector.mCurrentSectionIndex] ); CI_LOG_V( "selected output device named: " << dev->getName() << ", key: " << dev->getKey() ); setOutputDevice( dev ); return; } size_t currentInputIndex = mInputSelector.mCurrentSectionIndex; if( mInputSelector.hitTest( pos ) && currentInputIndex != mInputSelector.mCurrentSectionIndex ) { auto dev = audio::Device::findDeviceByName( mInputSelector.mSegments[mInputSelector.mCurrentSectionIndex] ); CI_LOG_V( "selected input named: " << dev->getName() << ", key: " << dev->getKey() ); setInputDevice( dev ); return; } }
void DeviceTestApp::setInputDevice( const audio::DeviceRef &device, size_t numChannels ) { audio::ScopedEnableNode enableNodeScope( mInputDeviceNode, false ); if( mInputDeviceNode ) mInputDeviceNode->disconnectAllOutputs(); auto format = audio::Node::Format().autoEnable(); if( numChannels ) format.channels( numChannels ); mInputDeviceNode = audio::master()->createInputDeviceNode( device, format ); setupTest( mTestSelector.currentSection() ); CI_LOG_V( "InputDeviceNode device properties: " ); printDeviceDetails( device ); }
void SamplePlayerNodeTestApp::update() { // light up rects if an xrun was detected const float xrunFadeTime = 1.3f; auto filePlayer = dynamic_pointer_cast<audio::FilePlayerNode>( mSamplePlayerNode ); if( filePlayer ) { if( filePlayer->getLastUnderrun() ) timeline().apply( &mUnderrunFade, 1.0f, 0.0f, xrunFadeTime ); if( filePlayer->getLastOverrun() ) timeline().apply( &mOverrunFade, 1.0f, 0.0f, xrunFadeTime ); } // print SamplePlayerNode start / stop times if( mSamplePlayerNodeEnabledState != mSamplePlayerNode->isEnabled() ) { mSamplePlayerNodeEnabledState = mSamplePlayerNode->isEnabled(); string stateStr = mSamplePlayerNodeEnabledState ? "started" : "stopped"; CI_LOG_V( "mSamplePlayerNode " << stateStr << " at " << to_string( getElapsedSeconds() ) << ", isEof: " << boolalpha << mSamplePlayerNode->isEof() << dec ); } bool testIsRecorder = ( mTestSelector.currentSection() == "recorder" ); mRecordButton.mHidden = mWriteButton.mHidden = mAutoResizeButton.mHidden = ! testIsRecorder; // test auto resizing the Recorder's buffer depending on how full it is if( testIsRecorder && mAutoResizeButton.mEnabled ) { CI_ASSERT( mRecorder ); size_t writePos = mRecorder->getWritePosition(); size_t numFrames = mRecorder->getNumFrames(); if( writePos + mRecorder->getSampleRate() / 2 > numFrames ) { size_t resizeFrames = numFrames + mRecorder->getSampleRate(); CI_LOG_V( "writePos: " << writePos << ", numFrames: " << numFrames << ", resizing frames to: " << resizeFrames ); mRecorder->setNumFrames( resizeFrames ); } if( mRecorder->getLastOverrun() ) timeline().apply( &mRecorderOverrunFade, 1.0f, 0.0f, xrunFadeTime ); } }
void SamplePlayerNodeTestApp::draw() { gl::clear(); if( mTestSelector.currentSection() == "recorder" ) { audio::BufferRef recordedBuffer = mRecorder->getRecordedCopy(); drawAudioBuffer( *recordedBuffer, getWindowBounds() ); } else { auto bufferPlayer = dynamic_pointer_cast<audio::BufferPlayerNode>( mSamplePlayerNode ); if( bufferPlayer ) mWaveformPlot.draw(); else if( mMonitor && mMonitor->isInitialized() ) drawAudioBuffer( mMonitor->getBuffer(), getWindowBounds() ); float readPos = (float)getWindowWidth() * mSamplePlayerNode->getReadPosition() / mSamplePlayerNode->getNumFrames(); gl::color( ColorA( 0, 1, 0, 0.7f ) ); gl::drawSolidRoundedRect( Rectf( readPos - 2, 0, readPos + 2, (float)getWindowHeight() ), 2 ); } if( mUnderrunFade > 0.0001f ) { gl::color( ColorA( 1, 0.5f, 0, mUnderrunFade ) ); gl::drawSolidRect( mUnderrunRect ); gl::drawStringCentered( "play underrun", mUnderrunRect.getCenter(), Color::black() ); } if( mOverrunFade > 0.0001f ) { gl::color( ColorA( 1, 0.5f, 0, mOverrunFade ) ); gl::drawSolidRect( mOverrunRect ); gl::drawStringCentered( "play overrun", mOverrunRect.getCenter(), Color::black() ); } if( mRecorderOverrunFade > 0.0001f ) { gl::color( ColorA( 1, 0.5f, 0, mRecorderOverrunFade ) ); gl::drawSolidRect( mRecorderOverrunRect ); gl::drawStringCentered( "rec overrun", mRecorderOverrunRect.getCenter(), Color::black() ); } drawWidgets( mWidgets ); }
void VoiceTestApp::processTap( Vec2i pos ) { if( mPlayButton.hitTest( pos ) ) mVoice->start(); size_t currentIndex = mTestSelector.mCurrentSectionIndex; if( mTestSelector.hitTest( pos ) && currentIndex != mTestSelector.mCurrentSectionIndex ) { string currentTest = mTestSelector.currentSection(); CI_LOG_V( "selected: " << currentTest ); if( currentTest == "basic" ) setupBasic(); if( currentTest == "basic stereo" ) setupBasicStereo(); else if( currentTest == "scope" ) setupScope(); else if( currentTest == "file 2" ) setupDifferentFile(); PRINT_GRAPH( audio::master() ); } }
void SamplePlayerNodeTestApp::processTap( ivec2 pos ) { if( mEnableSamplePlayerNodeButton.hitTest( pos ) ) mSamplePlayerNode->setEnabled( ! mSamplePlayerNode->isEnabled() ); else if( mStartPlaybackButton.hitTest( pos ) ) triggerStartStop( true ); else if( mStopPlaybackButton.hitTest( pos ) ) triggerStartStop( false ); else if( mLoopButton.hitTest( pos ) ) mSamplePlayerNode->setLoopEnabled( ! mSamplePlayerNode->isLoopEnabled() ); else if( mRecordButton.hitTest( pos ) ) { if( mRecordButton.mEnabled ) mRecorder->start(); else mRecorder->disable(); } else if( mWriteButton.hitTest( pos ) ) writeRecordedToFile(); else if( mAutoResizeButton.hitTest( pos ) ) ; else if( mAsyncButton.hitTest( pos ) ) ; else if( pos.y > getWindowCenter().y ) seek( pos.x ); size_t currentIndex = mTestSelector.mCurrentSectionIndex; if( mTestSelector.hitTest( pos ) && currentIndex != mTestSelector.mCurrentSectionIndex ) { string currentTest = mTestSelector.currentSection(); CI_LOG_V( "selected: " << currentTest ); if( currentTest == "BufferPlayerNode" ) setupBufferPlayerNode(); if( currentTest == "FilePlayerNode" ) setupFilePlayerNode(); if( currentTest == "recorder" ) setupBufferRecorderNode(); } }