Android多媒体:音效链
2015-07-18 13:15
579 查看
Android有一个默认的音效实现机制,是用音效链来实现的,一个音效可以认为是一个数字滤波器,对PCM音频数据进行处理。
每个音效处理逻辑被编译成一个so库,放在system/lib/soundfx下面。
DownMixer
这个音效比较常用,就是把多声道音频给降级成双声道的。
DownMixer分为两种策略,一种是直接把左右声道之外的声道去掉,叫DOWNMIX_TYPE_STRIP;一种是把左右边的声道叠加到左右声道上,叫DOWNMIX_TYPE_FOLD。而多声道的处理分为几种:CHANNEL_MASK_QUAD_BACK,CHANNEL_MASK_QUAD_SIDE,CHANNEL_MASK_SURROUND,CHANNEL_MASK_5POINT1_BACK,CHANNEL_MASK_5POINT1_SIDE,CHANNEL_MASK_7POINT1_SIDE_BACK。
QUAD指的是Quadraphonic,四声道环绕立体声。具体的叠加就是防止溢出:
// FL + RL
pDst[0] = clamp16((pSrc[0] + pSrc[2])>> 1);
// FR + RR
pDst[1] = clamp16((pSrc[1] + pSrc[3])>> 1);
surround sound指的是前左,前右,前中,后中四路,算法如下:
centerPlusRearContrib = (pSrc[2] *MINUS_3_DB_IN_Q19_12) + (pSrc[3] * MINUS_3_DB_IN_Q19_12);
// FL + centerPlusRearContrib
lt = (pSrc[0] << 12) + centerPlusRearContrib;
// FR + centerPlusRearContrib
rt = (pSrc[1] << 12) + centerPlusRearContrib;
// store in destination
pDst[0] = clamp16(lt >> 13); // differs from when accumulate istrue above
pDst[1] = clamp16(rt >> 13); // differs from when accumulate istrue above
对于5.1声道的
centerPlusLfeContrib = (pSrc[2] *MINUS_3_DB_IN_Q19_12)
+ (pSrc[3] *MINUS_3_DB_IN_Q19_12);
// FL + centerPlusLfeContrib+ RL
lt = (pSrc[0] << 12) + centerPlusLfeContrib + (pSrc[4] <<12);
// FR + centerPlusLfeContrib + RR
rt = (pSrc[1] << 12) + centerPlusLfeContrib + (pSrc[5] <<12);
// store in destination
pDst[0] = clamp16(lt >> 13); // differs from when accumulate istrue above
pDst[1] = clamp16(rt >> 13); // differs from when accumulate istrue above
pSrc += 6;
pDst += 2;
Virtualizer
static inline int32_t clamp32(int64_tsample)
{
// check overflow for both positive and negative values:
// all bits above short range must me equal to sign bit
if ((sample>>31) ^ (sample>>63))
sample = 0x7FFFFFFF ^ (sample>>63);
return sample;
}
上面是32bit数相加防止溢出的。
for (int i = 0; i < len; i++) {
#ifdef MTK_HIGH_RESOLUTION_AUDIO_SUPPORT
int32_t smp =inBuffer->s32[i]>>16;
#else
int32_t smp = inBuffer->s16[i];
#endif
if (smp < 0) smp = -smp - 1; // take care to keep the max negative inrange
int32_t clz = __builtin_clz(smp);
if (shift > clz) shift = clz;
}
这段不知道啥意思。可视化音频指的是把音频图像化
Bundle
#define CHECK_ARG(cond) { \
if (!(cond)) { \
ALOGV("Invalid argument: "#cond); \
return -EINVAL; \
} \
}
似乎是一组音效的混合,所以称为Bundle
Reverberation
the persistence of sound after a sound isproduced.
这个算法的核心是此结构体:ReverbContext,然后在LVREV_Process里进行处理
核心函数LVREV_Process,以及ReverbBlock。可以看到,在数学上,其实是用高低通滤波器来做的。具体数学上的内容参考:
http://en.wikipedia.org/wiki/Reverberation
每个音效处理逻辑被编译成一个so库,放在system/lib/soundfx下面。
DownMixer
这个音效比较常用,就是把多声道音频给降级成双声道的。
DownMixer分为两种策略,一种是直接把左右声道之外的声道去掉,叫DOWNMIX_TYPE_STRIP;一种是把左右边的声道叠加到左右声道上,叫DOWNMIX_TYPE_FOLD。而多声道的处理分为几种:CHANNEL_MASK_QUAD_BACK,CHANNEL_MASK_QUAD_SIDE,CHANNEL_MASK_SURROUND,CHANNEL_MASK_5POINT1_BACK,CHANNEL_MASK_5POINT1_SIDE,CHANNEL_MASK_7POINT1_SIDE_BACK。
QUAD指的是Quadraphonic,四声道环绕立体声。具体的叠加就是防止溢出:
// FL + RL
pDst[0] = clamp16((pSrc[0] + pSrc[2])>> 1);
// FR + RR
pDst[1] = clamp16((pSrc[1] + pSrc[3])>> 1);
surround sound指的是前左,前右,前中,后中四路,算法如下:
centerPlusRearContrib = (pSrc[2] *MINUS_3_DB_IN_Q19_12) + (pSrc[3] * MINUS_3_DB_IN_Q19_12);
// FL + centerPlusRearContrib
lt = (pSrc[0] << 12) + centerPlusRearContrib;
// FR + centerPlusRearContrib
rt = (pSrc[1] << 12) + centerPlusRearContrib;
// store in destination
pDst[0] = clamp16(lt >> 13); // differs from when accumulate istrue above
pDst[1] = clamp16(rt >> 13); // differs from when accumulate istrue above
对于5.1声道的
centerPlusLfeContrib = (pSrc[2] *MINUS_3_DB_IN_Q19_12)
+ (pSrc[3] *MINUS_3_DB_IN_Q19_12);
// FL + centerPlusLfeContrib+ RL
lt = (pSrc[0] << 12) + centerPlusLfeContrib + (pSrc[4] <<12);
// FR + centerPlusLfeContrib + RR
rt = (pSrc[1] << 12) + centerPlusLfeContrib + (pSrc[5] <<12);
// store in destination
pDst[0] = clamp16(lt >> 13); // differs from when accumulate istrue above
pDst[1] = clamp16(rt >> 13); // differs from when accumulate istrue above
pSrc += 6;
pDst += 2;
Virtualizer
static inline int32_t clamp32(int64_tsample)
{
// check overflow for both positive and negative values:
// all bits above short range must me equal to sign bit
if ((sample>>31) ^ (sample>>63))
sample = 0x7FFFFFFF ^ (sample>>63);
return sample;
}
上面是32bit数相加防止溢出的。
for (int i = 0; i < len; i++) {
#ifdef MTK_HIGH_RESOLUTION_AUDIO_SUPPORT
int32_t smp =inBuffer->s32[i]>>16;
#else
int32_t smp = inBuffer->s16[i];
#endif
if (smp < 0) smp = -smp - 1; // take care to keep the max negative inrange
int32_t clz = __builtin_clz(smp);
if (shift > clz) shift = clz;
}
这段不知道啥意思。可视化音频指的是把音频图像化
Bundle
#define CHECK_ARG(cond) { \
if (!(cond)) { \
ALOGV("Invalid argument: "#cond); \
return -EINVAL; \
} \
}
似乎是一组音效的混合,所以称为Bundle
Reverberation
the persistence of sound after a sound isproduced.
这个算法的核心是此结构体:ReverbContext,然后在LVREV_Process里进行处理
核心函数LVREV_Process,以及ReverbBlock。可以看到,在数学上,其实是用高低通滤波器来做的。具体数学上的内容参考:
http://en.wikipedia.org/wiki/Reverberation
相关文章推荐
- Android多媒体:AudioSystem,AudioService和AudioManager
- 对android volley框架的理解(一)
- Android Material Design之Toolbar与Palette实践
- android菜鸟学习笔记30----Android使用百度地图API(一)准备工作及在应用中显示地图
- Android项目重构之路:实现篇 读后思考
- Android View深入学习(一),View的测量(Measure)过程
- Android的Looper,Handler以及线程间的通信
- Android 使用AIDL调用外部服务
- Android判断SD卡是否已经挂载的方法
- 【Android Util】全局控制Log打印日志
- android 升级sdk后,adt问题
- 【Android Util】尺寸单位 dp 和 px 相互转换
- listView返回顶部
- android学习之旅
- Android多媒体:OMX
- android 设计模式之单例模式
- Android Studio AIDL 的使用 。
- Android--ViewDragHelper完全解析 自定义ViewGroup神器
- Android检查手机上是否安装了第三方软件的方法---本文以百度地图为例
- Android--百分比布局库(percent-support-lib)