@ -80,6 +80,7 @@ public:
MIXER_CHANNEL_MASK = 0x4006 , // Channel mask for mixer output
// for haptic
HAPTIC_ENABLED = 0x4007 , // Set haptic data from this track should be played or not.
HAPTIC_INTENSITY = 0x4008 , // Set the intensity to play haptic data.
// for target RESAMPLE
SAMPLE_RATE = 0x4100 , // Configure sample rate conversion on this track name;
// parameter 'value' is the new sample rate in Hz.
@ -102,6 +103,31 @@ public:
// parameter 'value' is a pointer to the new playback rate.
} ;
enum { // Haptic intensity, should keep consistent with VibratorService
HAPTIC_SCALE_VERY_LOW = - 2 ,
HAPTIC_SCALE_LOW = - 1 ,
HAPTIC_SCALE_NONE = 0 ,
HAPTIC_SCALE_HIGH = 1 ,
HAPTIC_SCALE_VERY_HIGH = 2 ,
} ;
typedef int32_t haptic_intensity_t ;
static constexpr float HAPTIC_SCALE_VERY_LOW_RATIO = 2 / 3 ;
static constexpr float HAPTIC_SCALE_LOW_RATIO = 3 / 4 ;
static const CONSTEXPR float HAPTIC_MAX_AMPLITUDE_FLOAT = 1.0f ;
static inline bool isValidHapticIntensity ( haptic_intensity_t hapticIntensity ) {
switch ( hapticIntensity ) {
case HAPTIC_SCALE_VERY_LOW :
case HAPTIC_SCALE_LOW :
case HAPTIC_SCALE_NONE :
case HAPTIC_SCALE_HIGH :
case HAPTIC_SCALE_VERY_HIGH :
return true ;
default :
return false ;
}
}
AudioMixer ( size_t frameCount , uint32_t sampleRate )
: mSampleRate ( sampleRate )
, mFrameCount ( frameCount ) {
@ -147,6 +173,7 @@ public:
}
}
( this - > * mHook ) ( ) ;
processHapticData ( ) ;
}
size_t getUnreleasedFrames ( int name ) const ;
@ -364,6 +391,7 @@ private:
// Haptic
bool mHapticPlaybackEnabled ;
haptic_intensity_t mHapticIntensity ;
audio_channel_mask_t mHapticChannelMask ;
uint32_t mHapticChannelCount ;
audio_channel_mask_t mMixerHapticChannelMask ;
@ -374,6 +402,37 @@ private:
uint32_t mAdjustNonDestructiveOutChannelCount ;
bool mKeepContractedChannels ;
float getHapticScaleGamma ( ) const {
// Need to keep consistent with the value in VibratorService.
switch ( mHapticIntensity ) {
case HAPTIC_SCALE_VERY_LOW :
return 2.0f ;
case HAPTIC_SCALE_LOW :
return 1.5f ;
case HAPTIC_SCALE_HIGH :
return 0.5f ;
case HAPTIC_SCALE_VERY_HIGH :
return 0.25f ;
default :
return 1.0f ;
}
}
float getHapticMaxAmplitudeRatio ( ) const {
// Need to keep consistent with the value in VibratorService.
switch ( mHapticIntensity ) {
case HAPTIC_SCALE_VERY_LOW :
return HAPTIC_SCALE_VERY_LOW_RATIO ;
case HAPTIC_SCALE_LOW :
return HAPTIC_SCALE_LOW_RATIO ;
case HAPTIC_SCALE_NONE :
case HAPTIC_SCALE_HIGH :
case HAPTIC_SCALE_VERY_HIGH :
default :
return 1.0f ;
}
}
private :
// hooks
void track__genericResample ( int32_t * out , size_t numFrames , int32_t * temp , int32_t * aux ) ;
@ -410,6 +469,8 @@ private:
template < int MIXTYPE , typename TO , typename TI , typename TA >
void process__noResampleOneTrack ( ) ;
void processHapticData ( ) ;
static process_hook_t getProcessHook ( int processType , uint32_t channelCount ,
audio_format_t mixerInFormat , audio_format_t mixerOutFormat ) ;