view libao2/ao_null.c @ 15507:2f4125e4025e
include get_path.c before avcodec.h, fix error on osx + gcc4 where defined macro always_inline in libavcodec/common.h already exist in math.h and used for something else.
author
nplourde
date
Wed, 18 May 2005 12:24:20 +0000 (2005-05-18)
parents
cae0dbeb44bb
children
b1b06adc5cd3
line source
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� #include <stdio.h>
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� #include <stdlib.h>
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� #include <sys/time.h>
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� #include "config.h"
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� #include "libaf/af_format.h"
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� #include "audio_out.h"
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� #include "audio_out_internal.h"
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� static ao_info_t info =
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� {
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� "Null audio output",
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� "null",
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� "Tobias Diedrich",
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� ""
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� };
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� LIBAO_EXTERN(null)
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� struct timeval last_tv;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� int buffer;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� static void drain(){
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� struct timeval now_tv;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� int temp, temp2;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� gettimeofday(&now_tv, 0);
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� temp = now_tv.tv_sec - last_tv.tv_sec;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� temp *= ao_data.bps;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� temp2 = now_tv.tv_usec - last_tv.tv_usec;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� temp2 /= 1000;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� temp2 *= ao_data.bps;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� temp2 /= 1000;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� temp += temp2;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� buffer-=temp;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� if (buffer<0) buffer=0;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� if(temp>0) last_tv = now_tv;//mplayer is fast
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� }
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� // to set/get/query special features/parameters
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� static int control(int cmd,void *arg){
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� return -1;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� }
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� // open & setup audio device
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� // return: 1=success 0=fail
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� static int init(int rate,int channels,int format,int flags){
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� ao_data.buffersize= 65536;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� ao_data.outburst=1024;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� ao_data.channels=channels;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� ao_data.samplerate=rate;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� ao_data.format=format;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� ao_data.bps=channels*rate;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� if (format != AF_FORMAT_U8 && format != AF_FORMAT_S8)
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� ao_data.bps*=2;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� buffer=0;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� gettimeofday(&last_tv, 0);
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� return 1;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� }
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� // close audio device
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� static void uninit(int immed){
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� }
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� // stop playing and empty buffers (for seeking/pause)
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� static void reset(){
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� buffer=0;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� }
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� // 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()
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� {
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� }
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� // return: how many bytes can be played without blocking
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� static int get_space(){
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� drain();
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� return ao_data.buffersize - buffer;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� }
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� // plays 'len' bytes of 'data'
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� // it should round it down to outburst*n
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� // return: number of bytes played
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� static int play(void* data,int len,int flags){
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� int maxbursts = (ao_data.buffersize - buffer) / ao_data.outburst;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� int playbursts = len / ao_data.outburst;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� int bursts = playbursts > maxbursts ? maxbursts : playbursts;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� buffer += bursts * ao_data.outburst;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� return bursts * ao_data.outburst;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� }
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� // return: delay in seconds between first and last sample in buffer
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� static float get_delay(){
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩���
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� drain();
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� return (float) buffer / (float) ao_data.bps;
+ ��膩��鰹申鐃順�渇����紮�鐃醇�鐃緒申鐃緒申����鐃初��膩��鰹申鐃順�渇��膩��� }