音乐播放器]播放器播放歌曲时,是否有缓冲机制?如果有,缓冲机制是什么样的?”,
音乐缓存文件路径为 “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文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。
故该缓存仍是在手机内存,而非手机存储中,重启手机之后,音乐则不能够继续播放了。
相关链接:
http://blog.csdn.net/zdwzzu2006/article/details/7747977#0-tsina-1-35783-397232819ff9a47a7b7e80a40613cfe1
ALPS02514729