音乐缓存问题的解析
来源:互联网 发布:js绘制流程图的插件 编辑:程序博客网 时间:2024/06/04 18:51
音乐播放器]播放器播放歌曲时,是否有缓冲机制?如果有,缓冲机制是什么样的?”,
音乐缓存文件路径为 “sprintf(path, "/proc/%d/fd/%d", gettid(), fd);”
关键点为filesourceProxy.cpp的如下函数:#ifndef USE_CACHE_MMAP
char path[256];
char filename[256];
memset(path, 0, 256);
memset(filename, 0, 256);
sprintf(path, "/proc/%d/fd/%d", gettid(), fd);
int len = 0;
len = readlink(path, filename, sizeof(filename));
if (len) {
mDupFd = open(filename, O_LARGEFILE | O_RDONLY);
if (mDupFd == -1) SXLOGE("Open dupFd fail for file %s", filename);
}
#endif
下面列出从上层音乐开始播放某首歌曲到刚才的那个filesourceProxy.cpp的流程callstack大致如下:
music apk的如下代码开始:
mediaPlaybackservice.java:
public boolean open(String path)
mPlayer.setDataSourceAsync(mFileToPlay);( public void setDataSourceAsync(String path))
mIsInitialized = setDataSourceImpl(mCurrentMediaPlayer, path, true);( private boolean setDataSourceImpl(MediaPlayer player, String path, boolean async))
中间其他部分省略,这里最终会call到下面的通用mediaplayer的如下方法中:
mediaplayer.java的_setDataSource
android_media_mediaplayer..cpp中的:android_media_MediaPlayer_setDataSourceFD
然后到mediaplayer.cpp中的setDataSource方法中,再到mediaplayerservice.cpp中的setDataSource,进一步到strageFrightPlayer.cpp的setDataSource,再到awesomePlayer.cpp的setDataSource,此刻真正进入实质代码阶段,前面部分基本是流程调用。
awesomePlayer.cpp中的方法status_t AwesomePlayer::setDataSource(
int fd, int64_t offset, int64_t length) 的如下部分即为关键部分:
sp<DataSource> dataSource = new FileSource(fd, offset, length);
进入fileSource.cpp中构造函数:FileSource::FileSource(const char *filename),其中的如下代码即为重点部分:
gFileSourceProxy.registerFd(mFd, mOffset, mLength);
这里就调用到filesourceproxy.cpp的方法status_t FileSourceProxy::registerFd(int fd, int64_t offset, int64_t length) ,
这个方法里完成的一个工作就是如下代码:
sp<FileCache> fc = new FileCache(fd, offset, length, 0, 0, this);
进而走进FileCache类构造方法:
FileCache::FileCache(int fd,
int64_t offset,
int64_t length,
size_t cacheSize,
size_t cacheCount,
FileSourceProxy *observer)
接下来的流程,就是设置文件缓冲路径等,
#ifndef USE_CACHE_MMAP
char path[256];
char filename[256];
memset(path, 0, 256);
memset(filename, 0, 256);
sprintf(path, "/proc/%d/fd/%d", gettid(), fd);
int len = 0;
len = readlink(path, filename, sizeof(filename));
if (len) {
mDupFd = open(filename, O_LARGEFILE | O_RDONLY);
if (mDupFd == -1) SXLOGE("Open dupFd fail for file %s", filename);
}
#endif
但/proc目录
Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。
故该缓存仍是在手机内存,而非手机存储中,重启手机之后,音乐则不能够继续播放了。
相关链接:
Linux下/proc目录简介
ALPS02514729
0 0
- 音乐缓存问题的解析
- Fragment缓存问题的解析
- Fragment缓存问题的解析
- ATS无法缓存QQ音乐的音频文件问题
- ASIHttpRequest缓存的重点问题解析
- 音乐播放的问题?
- 解决酷狗音乐缓存文件kgtemp文件无法播放的问题
- 网易云音乐缓存音乐/视频文件的解密操作
- 不同音乐的欣赏解析
- 关于java的DNS解析IP缓存问题
- sencha Touch 缓存问题解析
- android音乐播放器有时查询不到音乐的问题
- 利用Chrome浏览器的缓存保存音乐或视频
- Android音乐播放器的缓存机制设计
- Spark的缓存管理解析
- AVAudioPlayer的音乐不能播放的问题
- 网页的缓存问题
- ajax的缓存问题
- IIS日志-网站运维的好帮手
- Sql Server 2016中增加了对JSON的内置支持
- PHP数组遍历差异(array_diff的实现)
- 开始
- 登陆成功后返回前一个页面
- 音乐缓存问题的解析
- iOS怎样导出IPA包
- R语言の二叉树
- (一)为Android系统编写Linux内核驱动程序HelloWorld
- MCNearbyServiceBrowser
- Android常用代码段
- ajax--无ajax做到无刷新
- Java并发编程:线程池的使用
- c++多重继承