⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stream_file.c

📁 君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图片解码,浏览,电子书,录音,想学ucos,识货的人就下吧 russblock fmradio explore set
💻 C
字号:
#include "config.h"//#include <mplaylib.h>#include <sys/types.h>#include <sys/stat.h>#include "mp_msg.h"#include "stream.h"#include "help_mp.h"#include "m_option.h"#include "m_struct.h"static struct stream_priv_s {  char* filename;  char *filename2;} stream_priv_dflts = {  NULL, NULL};extern FS_FILE *  BUFF_Open ( const char *pFileName, const char *pMode );extern int BUFF_GetFileSize(FS_FILE * fp);extern unsigned int BUFF_DirectRead(int fp,char **buf,int len);extern int BUFF_Seek (FS_FILE * fp, long Offset, int Whence );extern void   BUFF_Close( FS_FILE * PORT  );#define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f)/// URL definitionstatic m_option_t stream_opts_fields[] = {  {"string", ST_OFF(filename), CONF_TYPE_STRING, 0, 0 ,0, NULL},  {"filename", ST_OFF(filename2), CONF_TYPE_STRING, 0, 0 ,0, NULL},  { NULL, NULL, 0, 0, 0, 0,  NULL }};static struct m_struct_st stream_opts = {  "file",  sizeof(struct stream_priv_s),  &stream_priv_dflts,  stream_opts_fields};  #define mplayread(x,y,z) BUFF_DirectRead(x,y,z)  static int fill_buffer(stream_t *s, char** buffer, int max_len){  int r = mplayread(s->fd,buffer,max_len);  return (r <= 0) ? -1 : r;}static int write_buffer(stream_t *s, char* buffer, int len) {  int r = write(s->fd,buffer,len);  return (r <= 0) ? -1 : r;}static int seek(stream_t *s,off_t newpos) {  s->pos = newpos;    if(BUFF_Seek(s->fd,s->pos,SEEK_SET)<0) {    s->eof=1;    return 0;  }  return 1;}static int seek_forward(stream_t *s,off_t newpos) {  if(newpos<s->pos){    mp_msg(MSGT_STREAM,MSGL_INFO,"Cannot seek backward in linear streams!\n");    return 0;  }  while(s->pos<newpos){    int len=s->fill_buffer(s,&(s->pBuffer),STREAM_BUFFER_SIZE);    if(len<=0){ s->eof=1; s->buf_pos=s->buf_len=0; break; } // EOF    s->buf_pos=0;    s->buf_len=len;    s->pos+=len;  }  return 1;}static void close_f(stream_t *s){	F("\n");	BUFF_Close(s->fd);	//close(s->fd);	F("\n");}static int control(stream_t *s, int cmd, void *arg) {  switch(cmd) {    case STREAM_CTRL_GET_SIZE: {      off_t size;      size = BUFF_Seek(s->fd, 0, SEEK_END);      BUFF_Seek(s->fd, s->pos, SEEK_SET);      if(size != (off_t)-1) {        *((off_t*)arg) = size;        return 1;      }     case STREAM_CTRL_RESET:     	F("reset;\n");     	s->pos = 0;     	BUFF_Seek(s->fd, 0, SEEK_SET);      return 1;     }  }  return STREAM_UNSUPPORTED;}static int open_f(stream_t *stream,int mode, void* opts, int* file_format) {  int f;  mode_t m = 0;  off_t len;  unsigned char *filename;  struct stream_priv_s* p = (struct stream_priv_s*)opts;	char rmode[12];  if(mode == STREAM_READ)    strcpy(rmode,"rb");  else if(mode == STREAM_WRITE)    strcpy(rmode,"wb");  else {    mp_msg(MSGT_OPEN,MSGL_ERR, "[file] Unknown open mode %d\n",mode);    m_struct_free(&stream_opts,opts);    return STREAM_UNSUPPORTED;  }  if(p->filename)    filename = p->filename;  else if(p->filename2)    filename = p->filename2;  else    filename = NULL;  if(!filename) {    mp_msg(MSGT_OPEN,MSGL_ERR, "[file] No filename\n");    m_struct_free(&stream_opts,opts);    return STREAM_ERROR;  }   f=BUFF_Open(filename,rmode);   if(f==0) {    mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_FileNotFound,filename);    m_struct_free(&stream_opts,opts);    return STREAM_ERROR;  }	len = BUFF_GetFileSize(f);  //len=lseek(f,0,SEEK_END); lseek(f,0,SEEK_SET);  if(len == -1) {    if(mode == STREAM_READ) stream->seek = seek_forward;    stream->type = STREAMTYPE_STREAM; // Must be move to STREAMTYPE_FILE    stream->flags |= STREAM_SEEK_FW;  }   else if(len >= 0) {    stream->seek = seek;    stream->end_pos = len;    stream->type = STREAMTYPE_FILE;  }  mp_msg(MSGT_OPEN,MSGL_V,"[file] File size is %"PRId64" bytes\n", (int64_t)len);  stream->fd = f;  stream->fill_buffer = fill_buffer;  stream->write_buffer = NULL;  stream->control = control;  stream->close = close_f;   m_struct_free(&stream_opts,opts);  return STREAM_OK;}stream_info_t stream_info_file = {  "File",  "file",  "Albeu",  "based on the code from ??? (probably Arpi)",  open_f,  { "file", "", NULL },  &stream_opts,  1 // Urls are an option string};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -