音乐缓存问题的解析

来源:互联网 发布: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目录简介

http://blog.csdn.net/zdwzzu2006/article/details/7747977#0-tsina-1-35783-397232819ff9a47a7b7e80a40613cfe1


ALPS02514729

0 0
原创粉丝点击