Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Z
ZLMediaKit
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
张翔宇
ZLMediaKit
Commits
895dc04f
Commit
895dc04f
authored
3 years ago
by
ziyue
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修复sdl音频重采样内存越界的bug以及修复重采样爆音bug
parent
186c1536
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
17 行增加
和
9 行删除
+17
-9
player/AudioSRC.cpp
+15
-7
player/AudioSRC.h
+2
-2
没有找到文件。
player/AudioSRC.cpp
查看文件 @
895dc04f
...
...
@@ -51,29 +51,37 @@ int AudioSRC::getPCMData(char *buf, int size) {
return
_delegate
->
getPCMData
(
buf
,
size
);
}
if
((
int
)(
size
/
_audio_cvt
.
len_ratio
)
!=
_origin_size
)
{
_origin_size
=
size
/
_audio_cvt
.
len_ratio
;
_origin_buf
.
reset
(
new
char
[(
std
::
max
)(
_origin_size
,
size
)],
[](
char
*
ptr
)
{
//对应的未转换前pcm的长度
auto
original_size
=
(
int
)
(
size
/
_audio_cvt
.
len_ratio
);
if
(
original_size
%
4
!=
0
)
{
//必须为4byte的整数(双通道16bit一个采样就4个字节)
original_size
=
4
*
(
original_size
/
4
)
+
4
;
}
//需要准备这么长的buf用于重采样
if
((
int
)
(
original_size
*
_audio_cvt
.
len_mult
)
!=
_buf_size
)
{
_buf_size
=
original_size
*
_audio_cvt
.
len_mult
;
_buf
.
reset
(
new
char
[
_buf_size
],
[](
char
*
ptr
)
{
delete
[]
ptr
;
});
InfoL
<<
"origin pcm buffer size is:"
<<
_origin
_size
<<
", target pcm buffer size is:"
<<
size
;
InfoL
<<
"origin pcm buffer size is:"
<<
original
_size
<<
", target pcm buffer size is:"
<<
size
;
}
auto
origin_size
=
_delegate
->
getPCMData
(
_
origin_buf
.
get
(),
_origin_size
);
auto
origin_size
=
_delegate
->
getPCMData
(
_
buf
.
get
(),
original_size
);
if
(
!
origin_size
)
{
//获取数据失败
TraceL
<<
"get empty pcm data"
;
return
0
;
}
_audio_cvt
.
buf
=
(
Uint8
*
)
_
origin_
buf
.
get
();
_audio_cvt
.
buf
=
(
Uint8
*
)
_buf
.
get
();
_audio_cvt
.
len
=
origin_size
;
if
(
0
!=
SDL_ConvertAudio
(
&
_audio_cvt
))
{
WarnL
<<
"SDL_ConvertAudio failed!"
;
_audio_cvt
.
len_cvt
=
0
;
}
if
(
_audio_cvt
.
len_cvt
)
{
_target_buf
.
append
(
_
origin_
buf
.
get
(),
_audio_cvt
.
len_cvt
);
_target_buf
.
append
(
_buf
.
get
(),
_audio_cvt
.
len_cvt
);
}
if
(
_target_buf
.
size
()
<
size
)
{
return
0
;
...
...
This diff is collapsed.
Click to expand it.
player/AudioSRC.h
查看文件 @
895dc04f
...
...
@@ -55,8 +55,8 @@ public:
private
:
bool
_enabled
=
true
;
int
_
origin
_size
=
0
;
std
::
shared_ptr
<
char
>
_
origin_
buf
;
int
_
buf
_size
=
0
;
std
::
shared_ptr
<
char
>
_buf
;
AudioSRCDelegate
*
_delegate
=
nullptr
;
BufferLikeString
_target_buf
;
SDL_AudioCVT
_audio_cvt
;
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论