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

📄 ao_mpegpes.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include "config.h"#ifdef HAVE_DVB_HEAD#define HAVE_DVB 1#endif#ifdef HAVE_DVB#include <sys/ioctl.h>#endif#include "audio_out.h"#include "audio_out_internal.h"#include "libaf/af_format.h"#include "mp_msg.h"#include "help_mp.h"#ifdef HAVE_DVB#ifndef HAVE_DVB_HEAD#include <ost/audio.h>audioMixer_t dvb_mixer={255,255};#else#include <linux/dvb/audio.h>audio_mixer_t dvb_mixer={255,255};#endif#endifextern int vo_mpegpes_fd;extern int vo_mpegpes_fd2;#include <errno.h>static ao_info_t info = {#ifdef HAVE_DVB	"DVB audio output",#else	"Mpeg-PES audio output",#endif	"mpegpes",	"A'rpi",	""};LIBAO_EXTERN(mpegpes)// to set/get/query special features/parametersstatic int control(int cmd,void *arg){#ifdef HAVE_DVB    switch(cmd){	case AOCONTROL_GET_VOLUME:	  if(vo_mpegpes_fd2>=0){	    ((ao_control_vol_t*)(arg))->left=dvb_mixer.volume_left/2.56;	    ((ao_control_vol_t*)(arg))->right=dvb_mixer.volume_right/2.56;	    return CONTROL_OK;	  }	  return CONTROL_ERROR;	case AOCONTROL_SET_VOLUME:	  if(vo_mpegpes_fd2>=0){	    dvb_mixer.volume_left=((ao_control_vol_t*)(arg))->left*2.56;	    dvb_mixer.volume_right=((ao_control_vol_t*)(arg))->right*2.56;	    if(dvb_mixer.volume_left>255) dvb_mixer.volume_left=255;	    if(dvb_mixer.volume_right>255) dvb_mixer.volume_right=255;	    //	 printf("Setting DVB volume: %d ; %d  \n",dvb_mixer.volume_left,dvb_mixer.volume_right);	    if ( (ioctl(vo_mpegpes_fd2,AUDIO_SET_MIXER, &dvb_mixer) < 0)){		mp_msg(MSGT_AO, MSGL_ERR, MSGTR_AO_MPEGPES_CantSetMixer,		    strerror(errno));	      return CONTROL_ERROR;	    }	    return CONTROL_OK;	  }	  return CONTROL_ERROR;    }#endif    return CONTROL_UNKNOWN;}static int freq=0;static int freq_id=0;// open & setup audio device// return: 1=success 0=failstatic int init(int rate,int channels,int format,int flags){/*#ifdef HAVE_DVB    if(vo_mpegpes_fd2<0) return 0; // couldn't open audio dev#else    if(vo_mpegpes_fd<0) return 0; // no file#endif*/    ao_data.channels=2;    ao_data.outburst=2000;    switch(format){	case AF_FORMAT_S16_LE:	case AF_FORMAT_S16_BE:	case AF_FORMAT_MPEG2:	case AF_FORMAT_AC3:	    ao_data.format=format;	    break;	default:	    ao_data.format=AF_FORMAT_S16_BE;    }    retry:    switch(rate){	case 48000:	freq_id=0;break;	case 96000:	freq_id=1;break;	case 44100:	freq_id=2;break;	case 32000:	freq_id=3;break;	default:	    mp_msg(MSGT_AO, MSGL_ERR, MSGTR_AO_MPEGPES_UnsupSamplerate, rate);#if 0	    if(rate>48000) rate=96000; else	    if(rate>44100) rate=48000; else	    if(rate>32000) rate=44100; else	    rate=32000;	    goto retry;#else	    rate=48000; freq_id=0;#endif    }    ao_data.bps=rate*2*2;    freq=ao_data.samplerate=rate;    return 1;}// close audio devicestatic void uninit(int immed){}// stop playing and empty buffers (for seeking/pause)static void reset(){}// stop playing, keep buffers (for pause)static void audio_pause(){    // for now, just call reset();    reset();}// resume playing, after audio_pause()static void audio_resume(){}void send_pes_packet(unsigned char* data,int len,int id,int timestamp);void send_lpcm_packet(unsigned char* data,int len,int id,int timestamp,int freq_id);extern int vo_pts;// return: how many bytes can be played without blockingstatic int get_space(){    float x=(float)( ao_data.pts)/90000.0;    int y;//    printf("vo_pts: %5.3f  ao_pts: %5.3f\n",vo_pts/90000.0,ao_data.pts/90000.0);    if(x<=0) return 0;    y=freq*4*x;y/=ao_data.outburst;y*=ao_data.outburst;    if(y>32000) y=32000;//    printf("diff: %5.3f -> %d  \n",x,y);    return y;}// plays 'len' bytes of 'data'// it should round it down to outburst*n// return: number of bytes playedstatic int play(void* data,int len,int flags){//    printf("\nao_mpegpes: play(%d) freq=%d\n",len,freq_id);    if(ao_data.format==AF_FORMAT_MPEG2)	send_pes_packet(data,len,0x1C0,ao_data.pts);    else {	int i;	unsigned short *s=data;//	if(len>2000) len=2000;//	printf("ao_mpegpes: len=%d  \n",len);	if(ao_data.format==AF_FORMAT_S16_LE || ao_data.format==AF_FORMAT_AC3)	    for(i=0;i<len/2;i++) s[i]=(s[i]>>8)|(s[i]<<8); // le<->be	send_lpcm_packet(data,len,0xA0,ao_data.pts,freq_id);    }    return len;}// return: delay in seconds between first and last sample in bufferstatic float get_delay(){    return 0.0;}

⌨️ 快捷键说明

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