status_t SoftAACEncoder2::setAudioParams() { // We call this whenever sample rate, number of channels or bitrate change // in reponse to setParameter calls. ALOGV("setAudioParams: %lu Hz, %lu channels, %lu bps", mSampleRate, mNumChannels, mBitRate); if (AACENC_OK != aacEncoder_SetParam(mAACEncoder, AACENC_AOT, getAOTFromProfile(mAACProfile))) { ALOGE("Failed to set AAC encoder parameters"); return UNKNOWN_ERROR; } if (AACENC_OK != aacEncoder_SetParam(mAACEncoder, AACENC_SAMPLERATE, mSampleRate)) { ALOGE("Failed to set AAC encoder parameters"); return UNKNOWN_ERROR; } if (AACENC_OK != aacEncoder_SetParam(mAACEncoder, AACENC_BITRATE, mBitRate)) { ALOGE("Failed to set AAC encoder parameters"); return UNKNOWN_ERROR; } if (AACENC_OK != aacEncoder_SetParam(mAACEncoder, AACENC_CHANNELMODE, getChannelMode(mNumChannels))) { ALOGE("Failed to set AAC encoder parameters"); return UNKNOWN_ERROR; } if (AACENC_OK != aacEncoder_SetParam(mAACEncoder, AACENC_TRANSMUX, TT_MP4_RAW)) { ALOGE("Failed to set AAC encoder parameters"); return UNKNOWN_ERROR; } return OK; }
OutputDeviceNode::OutputDeviceNode( const DeviceRef &device, const Format &format ) : OutputNode( format ), mDevice( device ) { if( ! mDevice ) { string errorMsg = "Empty DeviceRef."; if( ! audio::Device::getDefaultOutput() ) errorMsg += " Also, no default output Device so perhaps there is no available hardware output."; throw AudioDeviceExc( errorMsg ); } // listen to the notifications sent by device property changes in order to update the audio graph. mWillChangeConn = mDevice->getSignalParamsWillChange().connect( bind( &OutputDeviceNode::deviceParamsWillChange, this ) ); mDidChangeConn = mDevice->getSignalParamsDidChange().connect( bind( &OutputDeviceNode::deviceParamsDidChange, this ) ); mInterruptionBeganConn = Context::deviceManager()->getSignalInterruptionBegan().connect( [this] { disable(); } ); mInterruptionEndedConn = Context::deviceManager()->getSignalInterruptionEnded().connect( [this] { enable(); } ); size_t deviceNumChannels = mDevice->getNumOutputChannels(); // If number of channels hasn't been specified, default to 2 (or 1 if that is all that is available). if( getChannelMode() != ChannelMode::SPECIFIED ) { setChannelMode( ChannelMode::SPECIFIED ); setNumChannels( std::min( deviceNumChannels, (size_t)2 ) ); } // Double check the device has enough channels to support what was requested, which may not be the case if the user asked for more than what is available. if( deviceNumChannels < getNumChannels() ) throw AudioFormatExc( string( "Device can not accommodate " ) + to_string( deviceNumChannels ) + " output channels." ); }
status_t SoftAACEncoder2::setAudioParams() { // We call this whenever sample rate, number of channels, bitrate or SBR mode change // in reponse to setParameter calls. ALOGV("setAudioParams: %u Hz, %u channels, %u bps, %i sbr mode, %i sbr ratio", mSampleRate, mNumChannels, mBitRate, mSBRMode, mSBRRatio); if (AACENC_OK != aacEncoder_SetParam(mAACEncoder, AACENC_AOT, getAOTFromProfile(mAACProfile))) { ALOGE("Failed to set AAC encoder parameters"); return UNKNOWN_ERROR; } if (AACENC_OK != aacEncoder_SetParam(mAACEncoder, AACENC_SAMPLERATE, mSampleRate)) { ALOGE("Failed to set AAC encoder parameters"); return UNKNOWN_ERROR; } if (AACENC_OK != aacEncoder_SetParam(mAACEncoder, AACENC_BITRATE, mBitRate)) { ALOGE("Failed to set AAC encoder parameters"); return UNKNOWN_ERROR; } if (AACENC_OK != aacEncoder_SetParam(mAACEncoder, AACENC_CHANNELMODE, getChannelMode(mNumChannels))) { ALOGE("Failed to set AAC encoder parameters"); return UNKNOWN_ERROR; } if (AACENC_OK != aacEncoder_SetParam(mAACEncoder, AACENC_TRANSMUX, TT_MP4_RAW)) { ALOGE("Failed to set AAC encoder parameters"); return UNKNOWN_ERROR; } if (mSBRMode != -1 && mAACProfile == OMX_AUDIO_AACObjectELD) { if (AACENC_OK != aacEncoder_SetParam(mAACEncoder, AACENC_SBR_MODE, mSBRMode)) { ALOGE("Failed to set AAC encoder parameters"); return UNKNOWN_ERROR; } } /* SBR ratio parameter configurations: 0: Default configuration wherein SBR ratio is configured depending on audio object type by the FDK. 1: Downsampled SBR (default for ELD) 2: Dualrate SBR (default for HE-AAC) */ if (AACENC_OK != aacEncoder_SetParam(mAACEncoder, AACENC_SBR_RATIO, mSBRRatio)) { ALOGE("Failed to set AAC encoder parameters"); return UNKNOWN_ERROR; } return OK; }
OutputDeviceNode::OutputDeviceNode( const DeviceRef &device, const Format &format ) : OutputNode( format ), mDevice( device ) { CI_ASSERT( mDevice ); // listen to the notifications sent by device property changes in order to update the audio graph. mWillChangeConn = mDevice->getSignalParamsWillChange().connect( bind( &OutputDeviceNode::deviceParamsWillChange, this ) ); mDidChangeConn = mDevice->getSignalParamsDidChange().connect( bind( &OutputDeviceNode::deviceParamsDidChange, this ) ); size_t deviceNumChannels = mDevice->getNumOutputChannels(); // If number of channels hasn't been specified, default to 2 (or 1 if that is all that is available). if( getChannelMode() != ChannelMode::SPECIFIED ) { setChannelMode( ChannelMode::SPECIFIED ); setNumChannels( std::min( deviceNumChannels, (size_t)2 ) ); } // Double check the device has enough channels to support what was requested, which may not be the case if the user asked for more than what is available. if( deviceNumChannels < getNumChannels() ) throw AudioFormatExc( string( "Device can not accommodate " ) + to_string( deviceNumChannels ) + " output channels." ); }