static FileInfo *file_info_new(const char *file){ int fd; FileInfo *fi; wave_header_t header; int hsize; struct stat stbuf; int size; if ((fd=open(file,O_RDONLY|O_BINARY))==-1){ ms_error("Failed to open %s : %s",file,strerror(errno)); return NULL; } if (fstat(fd,&stbuf)==-1){ ms_error("could not fstat."); return NULL; } hsize=ms_read_wav_header_from_fd(&header,fd); if (hsize<=0){ ms_error("%s: not a wav file", file); return NULL; } if (wave_header_get_channel(&header)<1){ ms_error("%s: incorrect number of channels", file); return NULL; } fi=ms_new0(FileInfo,1); size=stbuf.st_size-hsize; fi->rate=wave_header_get_rate(&header); fi->nchannels=wave_header_get_channel(&header); fi->nsamples=size/(sizeof(int16_t)*fi->nchannels); fi->fd = fd; return fi; }
static int rec_get_length(const char *file, int *length){ wave_header_t header; int fd=open(file,O_RDONLY|O_BINARY); int ret=ms_read_wav_header_from_fd(&header,fd); close(fd); if (ret>0){ *length=le_uint32(header.data_chunk.len); }else{ *length=0; } return ret; }
static FileInfo *file_info_new(const char *file){ int fd; FileInfo *fi; wave_header_t header; int hsize; struct stat stbuf; int size; int err; if ((fd=open(file,O_RDONLY|O_BINARY))==-1){ ms_error("Failed to open %s : %s",file,strerror(errno)); return NULL; } if (fstat(fd,&stbuf)==-1){ ms_error("could not fstat."); return NULL; } hsize=ms_read_wav_header_from_fd(&header,fd); if (hsize<=0){ ms_error("%s: not a wav file", file); return NULL; } fi=ms_new0(FileInfo,1); size=stbuf.st_size-hsize; fi->buffer=ms_new0(int16_t,size/sizeof(int16_t)); fi->rate=wave_header_get_rate(&header); fi->nchannels=wave_header_get_channel(&header); fi->nsamples=size/(sizeof(int16_t)*fi->nchannels); err=read(fd,fi->buffer,size); if (err==-1){ ms_error("Could not read file: %s",strerror(errno)); goto error; }else if (err<size){ ms_error("Partial read of %i bytes",err); goto error; } return fi; error: file_info_destroy(fi); return NULL; }
bool_t ms_media_player_open(MSMediaPlayer *obj, const char *filepath) { wave_header_t header; int fd; char *tmp; ms_message("Openning %s", filepath); if(access(filepath, F_OK) != 0) { ms_error("Cannot open %s. File does not exist", filepath); return FALSE; } if(!_get_format(filepath, &obj->format)) { ms_error("Fails to detect file format of %s", filepath); return FALSE; } switch(obj->format) { case FILE_FORMAT_WAVE: fd = open(filepath, O_RDONLY); if(fd == -1) { ms_error("Cannot open %s", filepath); return FALSE; } if(ms_read_wav_header_from_fd(&header, fd) == -1) { ms_error("Cannot open %s. Invalid WAV format", filepath); return FALSE; } close(fd); if(wave_header_get_format_type(&header) != WAVE_FORMAT_PCM) { ms_error("Cannot open %s. Codec not supported", filepath); return FALSE; } obj->player = ms_filter_new(MS_FILE_PLAYER_ID); break; case FILE_FORMAT_MATROSKA: if((obj->player = ms_filter_new(MS_MKV_PLAYER_ID)) == NULL) { ms_error("Cannot open %s. Matroska file support is disabled", filepath); return FALSE; } break; case FILE_FORMAT_UNKNOWN: ms_error("Cannot open %s. Unknown format", filepath); return FALSE; } tmp = ms_strdup(filepath); if(ms_filter_call_method(obj->player, MS_PLAYER_OPEN, tmp) == -1) { ms_error("Cannot open %s", filepath); ms_free(tmp); ms_filter_destroy(obj->player); return FALSE; } ms_free(tmp); _create_decoders(obj); _create_sinks(obj); if(!_link_all(obj)) { ms_error("Cannot open %s. Could not build playing graph", filepath); _destroy_graph(obj); return FALSE; } ms_filter_add_notify_callback(obj->player, _eof_filter_notify_cb, obj, TRUE); ms_ticker_attach(obj->ticker, obj->player); obj->is_open = TRUE; obj->filename = ms_strdup(filepath); return TRUE; }