summaryrefslogtreecommitdiffstats
path: root/libao2/ao_plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'libao2/ao_plugin.c')
-rw-r--r--libao2/ao_plugin.c289
1 files changed, 0 insertions, 289 deletions
diff --git a/libao2/ao_plugin.c b/libao2/ao_plugin.c
deleted file mode 100644
index 0da8959c3e..0000000000
--- a/libao2/ao_plugin.c
+++ /dev/null
@@ -1,289 +0,0 @@
-#include "config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "mp_msg.h"
-#include "help_mp.h"
-#include "libaf/af_format.h"
-#include "audio_out.h"
-#include "audio_out_internal.h"
-
-#include "audio_plugin.h"
-
-static ao_info_t info =
-{
- "Plugin audio output",
- "plugin",
- "Anders",
- ""
-};
-
-LIBAO_EXTERN(plugin)
-
-#define plugin(i) (ao_plugin_local_data.plugins[i])
-#define driver() (ao_plugin_local_data.driver)
-
-// local data
-typedef struct ao_plugin_local_data_s
-{
- void* buf; // Output data buffer
- int len; // Amount of data in buffer
- int channels;
- int format;
- int bpm; //bit of format
- float bps; // Bytes per second out
- ao_functions_t* driver; // Output driver
- ao_plugin_functions_t** plugins; // List of used plugins
- ao_plugin_functions_t* available_plugins[NPL]; // List of available plugins
-} ao_plugin_local_data_t;
-
-static ao_plugin_local_data_t ao_plugin_local_data={NULL,0,0,0,0,0.0,NULL,NULL,AO_PLUGINS};
-
-// global data
-volatile ao_plugin_data_t ao_plugin_data; // Data used by the plugins
-ao_plugin_cfg_t ao_plugin_cfg=CFG_DEFAULTS; // Set in cfg-mplayer.h
-
-// to set/get/query special features/parameters
-static int control(int cmd,void *arg){
- switch(cmd){
- case AOCONTROL_SET_PLUGIN_DRIVER:
- ao_plugin_local_data.driver=arg;
- return CONTROL_OK;
- case AOCONTROL_GET_VOLUME:
- case AOCONTROL_SET_VOLUME:
- {
- int r=audio_plugin_volume.control(cmd,arg);
- if(CONTROL_OK != r)
- return driver()->control(cmd,arg);
- else
- return r;
- }
- default:
- return driver()->control(cmd,arg);
- }
- return CONTROL_UNKNOWN;
-}
-
-// Recursive function for adding plugins
-// return 1 for success and 0 for error
-int add_plugin(int i,char* cfg){
- int cnt=0;
- // Find end of plugin name
- while((cfg[cnt]!=',')&&(cfg[cnt]!='\0')&&(cnt<100)) cnt++;
- if(cnt >= 100)
- return 0;
-
- // Is this the last iteration or just another plugin
- if(cfg[cnt]=='\0'){
- ao_plugin_local_data.plugins=malloc((i+2)*sizeof(ao_plugin_functions_t*));
- if(ao_plugin_local_data.plugins){
- ao_plugin_local_data.plugins[i+1]=NULL;
- // Find the plugin matching the cfg string name
- cnt=0;
- while(ao_plugin_local_data.available_plugins[cnt] && cnt<20){
- if(0==strcmp(ao_plugin_local_data.available_plugins[cnt]->info->short_name,cfg)){
- ao_plugin_local_data.plugins[i]=ao_plugin_local_data.available_plugins[cnt];
- return 1;
- }
- cnt++;
- }
- mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_PLUGIN_InvalidPlugin,cfg);
- return 0;
- }
- else
- return 0;
- } else {
- cfg[cnt]='\0';
- if(add_plugin(i+1,&cfg[cnt+1])){
- cnt=0;
- // Find the plugin matching the cfg string name
- while(ao_plugin_local_data.available_plugins[cnt] && cnt < 20){
- if(0==strcmp(ao_plugin_local_data.available_plugins[cnt]->info->short_name,cfg)){
- ao_plugin_local_data.plugins[i]=ao_plugin_local_data.available_plugins[cnt];
- return 1;
- }
- cnt++;
- }
- mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_PLUGIN_InvalidPlugin,cfg);
- return 0;
- }
- else
- return 0;
- }
- return 0; // Will never happen...
-}
-
-// open & setup audio device and plugins
-// return: 1=success 0=fail
-static int init(int rate,int channels,int format,int flags){
- int use_plugin[NPL];
- int x,npl,unused=0;
- int ok=1;
- char *config;
-
- // Create list of plugins from cfg option
- int i=0;
- if(ao_plugin_cfg.plugin_list){
- config = malloc(strlen(ao_plugin_cfg.plugin_list)+1);
- if(!config) return 0;
- if(!strcpy(config, ao_plugin_cfg.plugin_list) || !add_plugin(i,config)){
- free(config);
- return 0;
- }
- free(config);
- }
-
- /* Set input parameters and itterate through plugins each plugin
- changes the parameters according to its output */
-
- ao_plugin_local_data.format=format;
- ao_plugin_local_data.channels=channels;
- ao_plugin_local_data.bpm=af_fmt2bits(format);
-
- ao_plugin_data.rate=rate;
- ao_plugin_data.channels=channels;
- ao_plugin_data.format=format;
- ao_plugin_data.sz_mult=1;
- ao_plugin_data.sz_fix=0;
- ao_plugin_data.delay_mult=1;
- ao_plugin_data.delay_fix=0;
-
- for(i=0;i<NPL && plugin(i);i++){
- use_plugin[i]=plugin(i)->init();
- if(!use_plugin[i]) plugin(i)->uninit();
- }
- npl=i;
- for(i=0;i<npl && plugin(i);i++)
- if(!use_plugin[i+unused]){
- unused++;
- for(x=i;x<npl && plugin(x+1);x++) plugin(x)=plugin(x+1);
- plugin(x)=NULL;
- npl--;
- i--;
- }
- i=npl;
-
- // Calculate bps
- ao_plugin_local_data.bps=(float)(ao_plugin_data.rate *
- ao_plugin_data.channels);
- ao_plugin_local_data.bps*=af_fmt2bits(ao_plugin_data.format)/8;
-
- // This should never happen but check anyway
- if(NULL==ao_plugin_local_data.driver)
- return 0;
-
- ok = driver()->init(ao_plugin_data.rate,
- ao_plugin_data.channels,
- ao_plugin_data.format,
- flags);
- if(!ok) return 0;
-
- /* Now that the driver is initialized we can calculate and set the
- input and output buffers for each plugin */
- ao_plugin_data.len=driver()->get_space();
- while((i>0) && ok)
- ok=plugin(--i)->control(AOCONTROL_PLUGIN_SET_LEN,0);
-
- if(!ok) return 0;
-
- // Allocate output buffer
- if(ao_plugin_local_data.buf)
- free(ao_plugin_local_data.buf);
- ao_plugin_local_data.buf=malloc(MAX_OUTBURST);
-
- if(!ao_plugin_local_data.buf) return 0;
-
- return 1;
-}
-
-// close audio device
-static void uninit(int immed){
- int i=0;
- driver()->uninit(immed);
- while(plugin(i))
- plugin(i++)->uninit();
- if(ao_plugin_local_data.plugins)
- free(ao_plugin_local_data.plugins);
- ao_plugin_local_data.plugins=NULL;
- if(ao_plugin_local_data.buf)
- free(ao_plugin_local_data.buf);
- ao_plugin_local_data.buf=NULL;
-}
-
-// stop playing and empty buffers (for seeking/pause)
-static void reset(){
- int i=0;
- driver()->reset();
- while(plugin(i))
- plugin(i++)->reset();
- ao_plugin_local_data.len=0;
-}
-
-// stop playing, keep buffers (for pause)
-static void audio_pause(){
- driver()->pause();
-}
-
-// resume playing, after audio_pause()
-static void audio_resume(){
- driver()->resume();
-}
-
-// return: how many bytes can be played without blocking
-static int get_space(){
-double sz;
-int isz;
- sz=(double)(driver()->get_space());
- if(sz+(double)ao_plugin_local_data.len > (double)MAX_OUTBURST)
- sz=(double)MAX_OUTBURST-(double)ao_plugin_local_data.len;
- sz*=ao_plugin_data.sz_mult;
- sz+=ao_plugin_data.sz_fix;
- isz=(int)(sz);
- isz-=isz%(ao_plugin_local_data.channels*ao_plugin_local_data.bpm/8);
- return isz;
-}
-
-// plays 'len' bytes of 'data'
-// return: number of bytes played
-static int play(void* data,int len,int flags){
- int l,i=0;
- // Limit length to avoid over flow in plugins
- int tmp = get_space();
- int ret_len =(tmp<len)?tmp:len;
- // keep all channels of each sample together
- ret_len -= ret_len % (ao_plugin_local_data.channels*ao_plugin_local_data.bpm/8);
- if(ret_len){
- // Filter data
- ao_plugin_data.len=ret_len;
- ao_plugin_data.data=data;
-
- while(plugin(i))
- plugin(i++)->play();
- // Copy data to output buffer
- memcpy(ao_plugin_local_data.buf+ao_plugin_local_data.len,
- ao_plugin_data.data,ao_plugin_data.len);
- // Send data to output
- l=driver()->play(ao_plugin_local_data.buf,
- ao_plugin_data.len+ao_plugin_local_data.len,flags);
- // Save away unsent data
- ao_plugin_local_data.len=ao_plugin_data.len+ao_plugin_local_data.len-l;
- memcpy(ao_plugin_local_data.buf,ao_plugin_local_data.buf+l,
- ao_plugin_local_data.len);
- }
- return ret_len;
-}
-
-// return: delay in seconds between first and last sample in buffer
-static float get_delay(){
- float delay=driver()->get_delay();
- delay+=(float)ao_plugin_local_data.len/ao_plugin_local_data.bps;
- delay*=ao_plugin_data.delay_mult;
- delay+=ao_plugin_data.delay_fix;
- return delay;
-}
-
-
-
-