[Mplayer-cvslog] CVS: main/libao2 pl_format.c,1.2,1.3 ao_plugin.c,1.3,1.4
Anders Johansson
anders at mplayer.dev.hu
Mon Dec 3 15:05:05 CET 2001
Update of /cvsroot/mplayer/main/libao2
In directory mplayer:/var/tmp.root/cvs-serv3039/libao2
Modified Files:
pl_format.c ao_plugin.c
Log Message:
Commandline interface to ao_plugin updated according to mplayers complex parameter format and plugin pl_format finished (alpha code needs testing)
Index: pl_format.c
===================================================================
RCS file: /cvsroot/mplayer/main/libao2/pl_format.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- pl_format.c 29 Nov 2001 13:43:52 -0000 1.2
+++ pl_format.c 3 Dec 2001 14:04:55 -0000 1.3
@@ -1,13 +1,16 @@
-/* This is a null audio out plugin it doesnt't really do anything
- useful but serves an example of how audio plugins work. It delays
- the output signal by the nuber of samples set by aop_delay n
- where n is the number of bytes.
- */
+/* This audio output plugin changes the format of a data block. Valid
+ output formats are: AFMT_U8, AFMT_S8, AFMT_S16_LE, AFMT_S16_BE
+ AFMT_U16_LE, AFMT_U16_BE, AFMT_S32_LE and AFMT_S32_BE. The output
+ format is spedified using the cfg switch 'format=NR' where NR is
+ the number as given in libao2/afmt.h
+*/
+
#define PLUGIN
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
+#include <inttypes.h>
#include "audio_out.h"
#include "audio_plugin.h"
@@ -29,28 +32,28 @@
{
void* data; // local audio data block
int len; // local buffer length
- int in; // Input fomat
- int out; // Output fomat
+ int in; // input fomat
+ int out; // output fomat
double sz_mult; // data size multiplier
} pl_format_t;
static pl_format_t pl_format={NULL,0,0,0,1};
// Number of bits
-#define B08 0
-#define B16 1
-#define B32 2
-#define NBITS_MASK 3
+#define B08 (0<<0)
+#define B16 (1<<0)
+#define B32 (2<<0)
+#define NBITS_MASK (3<<0)
// Endianess
-#define BE (0<<3) // Big endian
-#define LE (1<<3) // Little endian
-#define END_MASK (1<<3)
+#define BE (0<<2) // Big Endian
+#define LE (1<<2) // Little Endian
+#define END_MASK (1<<2)
// Signed
-#define US (0<<4)
-#define SI (1<<4)
-#define SIGN_MASK (1<<4)
+#define US (0<<3) // Un Signed
+#define SI (1<<3) // SIgned
+#define SIGN_MASK (1<<3)
// to set/get/query special features/parameters
static int control(int cmd,int arg){
@@ -59,8 +62,10 @@
if(pl_format.data)
uninit();
pl_format.len = ao_plugin_data.len;
+ if(ao_plugin_data.data)
+ free(ao_plugin_data.data);
pl_format.data=(void*)malloc(ao_plugin_data.len);
- ao_plugin_data.len=(int)((double)ao_plugin_data.len*pl_format.sz_mult);
+ ao_plugin_data.len=(int)(((double)ao_plugin_data.len)*pl_format.sz_mult);
return CONTROL_OK;
}
return -1;
@@ -69,11 +74,6 @@
// open & setup audio device
// return: 1=success 0=fail
static int init(){
- int i=0;
- int sign=0;
- int nbits=8;
- int be_le=BE;
-
// Sheck input format
switch(ao_plugin_data.format){
case(AFMT_U8):
@@ -81,7 +81,7 @@
case(AFMT_S8):
pl_format.in=LE|B08|SI; break;
case(AFMT_S16_LE):
- pl_format.in=LE|B16|US; break;
+ pl_format.in=LE|B16|SI; break;
case(AFMT_S16_BE):
pl_format.in=BE|B16|SI; break;
case(AFMT_U16_LE):
@@ -100,27 +100,27 @@
printf("[pl_format] Audio format not yet suported \n");
return 0;
default:
- printf("[pl_format] Unsupported audio format\n"); // Should never happen...
+ printf("[pl_format] Unrecognised input audio format\n"); //This can not happen ....
return 0;
}
// Sheck output format
switch(ao_plugin_cfg.pl_format_type){
case(AFMT_U8):
- pl_format.in=LE|B08|US; break;
+ pl_format.out=LE|B08|US; break;
case(AFMT_S8):
- pl_format.in=LE|B08|SI; break;
+ pl_format.out=LE|B08|SI; break;
case(AFMT_S16_LE):
- pl_format.in=LE|B16|US; break;
+ pl_format.out=LE|B16|SI; break;
case(AFMT_S16_BE):
- pl_format.in=BE|B16|SI; break;
+ pl_format.out=BE|B16|SI; break;
case(AFMT_U16_LE):
- pl_format.in=LE|B16|US; break;
+ pl_format.out=LE|B16|US; break;
case(AFMT_U16_BE):
- pl_format.in=BE|B16|US; break;
+ pl_format.out=BE|B16|US; break;
case(AFMT_S32_LE):
- pl_format.in=LE|B32|SI; break;
+ pl_format.out=LE|B32|SI; break;
case(AFMT_S32_BE):
- pl_format.in=BE|B32|SI; break;
+ pl_format.out=BE|B32|SI; break;
case(AFMT_IMA_ADPCM):
case(AFMT_MU_LAW):
case(AFMT_A_LAW):
@@ -129,19 +129,26 @@
printf("[pl_format] Audio format not yet suported \n");
return 0;
default:
- printf("[pl_format] Unsupported audio format\n"); // Should never happen...
+ printf("[pl_format] Unrecognised audio output format\n");
return 0;
}
+
+ // Tell the world what we are up to
+ printf("[pl_format] Input format: %s, output format: %s \n",
+ audio_out_format_name(ao_plugin_data.format),
+ audio_out_format_name(ao_plugin_cfg.pl_format_type));
+
// We are changing the format
ao_plugin_data.format=ao_plugin_cfg.pl_format_type;
-
- // And perhaps the buffer size
+
+ // Perhaps the buffer size
pl_format.sz_mult=1;
- if((pl_format.in&NBITS_MASK) < (pl_format.out&NBITS_MASK))
- pl_format.sz_mult/=(double)(1<<(pl_format.out-pl_format.in));
if((pl_format.in&NBITS_MASK) > (pl_format.out&NBITS_MASK))
- pl_format.sz_mult*=(double)(1<<(pl_format.out-pl_format.in));
- ao_plugin_data.sz_mult*=pl_format.sz_mult;
+ pl_format.sz_mult/=(double)(1<<((pl_format.in&NBITS_MASK)-(pl_format.out&NBITS_MASK)));
+ if((pl_format.in&NBITS_MASK) < (pl_format.out&NBITS_MASK))
+ pl_format.sz_mult*=(double)(1<<((pl_format.out&NBITS_MASK)-(pl_format.in&NBITS_MASK)));
+ ao_plugin_data.sz_mult/=pl_format.sz_mult;
+
return 1;
}
@@ -149,6 +156,7 @@
static void uninit(){
if(pl_format.data)
free(pl_format.data);
+ pl_format.data=NULL;
}
// empty buffers
@@ -160,37 +168,168 @@
// processes 'ao_plugin_data.len' bytes of 'data'
// called for every block of data
+// FIXME: this routine needs to be optimized (it is probably possible to do a lot here)
static int play(){
register int i=0;
void* in_data=ao_plugin_data.data;
void* out_data=pl_format.data;
- int in_len=((int)(double)pl_format.len*pl_format.sz_mult);
- in_len>>=pl_format.in&NBITS_MASK;
+ int len=(ao_plugin_data.len)>>(pl_format.in&NBITS_MASK);
+ ao_plugin_data.len=(int)(((double)ao_plugin_data.len)*=pl_format.sz_mult);
+ ao_plugin_data.len;
- if((pl_format.in&END_MASK)!=(pl_format.out&END_MASK)){
+ // Change to little endian (Is this true for sun ?)
+ if((pl_format.in&END_MASK)!=LE){
switch(pl_format.in&NBITS_MASK){
case(B16):{
- register int16_t s;
- for(i=1;i<in_len;i++){
- s=((int16_t*)in_data)[i];
- ((int16_t*)in_data)[i]=(int16_t)(((s&0x00FF)<<8) | (s&0xFF00)>>8);
+ register uint16_t s;
+ for(i=1;i<len;i++){
+ s=((uint16_t*)in_data)[i];
+ ((uint16_t*)in_data)[i]=(uint16_t)(((s&0x00FF)<<8) | (s&0xFF00)>>8);
}
break;
}
case(B32):{
- register int32_t s;
- for(i=1;i<in_len;i++){
- s=((int32_t*)in_data)[i];
- ((int32_t*)in_data)[i]=(int32_t)(((s&0x000000FF)<<24) | ((s&0x0000FF00)<<8) |
- ((s&0x00FF0000)>>8) | ((s&0xFF000000)>>24));
+ register uint32_t s;
+ for(i=1;i<len;i++){
+ s=((uint32_t*)in_data)[i];
+ ((uint32_t*)in_data)[i]=(uint32_t)(((s&0x000000FF)<<24) | ((s&0x0000FF00)<<8) |
+ ((s&0x00FF0000)>>8) | ((s&0xFF000000)>>24));
}
break;
}
}
}
+ // Change signed/unsigned
+ if((pl_format.in&SIGN_MASK) != (pl_format.out&SIGN_MASK)){
+ switch(pl_format.in&NBITS_MASK){
+ case(B08):{
+ switch(pl_format.in&SIGN_MASK){
+ case(US):{
+ for(i=0;i<len;i++)
+ ((int8_t*)in_data)[i]=(int8_t)(-127+((int)((uint8_t*)in_data)[i]));
+ break;
+ }
+ case(SI):{
+ for(i=0;i<len;i++)
+ ((uint8_t*)in_data)[i]=(uint8_t)(+127+((int)((int8_t*)in_data)[i]));
+ break;
+ }
+ break;
+ }
+ }
+ case(B16):{
+ switch(pl_format.in&SIGN_MASK){
+ case(US):{
+ for(i=0;i<len;i++)
+ ((int16_t*)in_data)[i]=(int16_t)(-32767+((int)((uint16_t*)in_data)[i]));
+ break;
+ }
+ case(SI):{
+ for(i=0;i<len;i++)
+ ((uint16_t*)in_data)[i]=(uint16_t)(+32767+((int)((int16_t*)in_data)[i]));
+ break;
+ }
+ break;
+ }
+ }
+ case(B32):{
+ switch(pl_format.in&SIGN_MASK){
+ case(US):{
+ for(i=0;i<len;i++)
+ ((int32_t*)in_data)[i]=(int32_t)(-(1<<31-1)+((uint32_t*)in_data)[i]);
+ break;
+ }
+ case(SI):{
+ for(i=0;i<len;i++)
+ ((uint32_t*)in_data)[i]=(uint32_t)(+(1<<31-1)+((int32_t*)in_data)[i]);
+ break;
+ }
+ break;
+ }
+ }
+ }
+ }
+ // Change the number of bits
+ if((pl_format.in&NBITS_MASK) == (pl_format.out&NBITS_MASK)){
+ int sz=(int)((double)ao_plugin_data.len/pl_format.sz_mult);
+ for(i=0;i<sz;i++)
+ ((char*)out_data)[i]=((char*)in_data)[i];
+ } else {
+ switch(pl_format.in&NBITS_MASK){
+ case(B08):{
+ switch(pl_format.out&NBITS_MASK){
+ case(B16):{
+ for(i=1;i<len;i++)
+ ((uint16_t*)out_data)[i]=((uint16_t)((uint8_t*)in_data)[i])<<8;
+ break;
+ }
+ case(B32):{
+ for(i=1;i<len;i++)
+ ((uint32_t*)out_data)[i]=((uint32_t)((uint8_t*)in_data)[i])<<24;
+ break;
+ }
+ }
+ }
+ case(B16):{
+ switch(pl_format.out&NBITS_MASK){
+ case(B08):{
+ for(i=0;i<len;i++)
+ ((uint8_t*)out_data)[i]=(uint8_t)((((uint16_t*)in_data)[i])>>8);
+ break;
+ }
+ case(B32):{
+ for(i=1;i<len;i++)
+ ((uint32_t*)out_data)[i]=((uint32_t)((uint16_t*)in_data)[i])<<16;
+ break;
+ }
+ }
+ }
+ case(B32):{
+ switch(pl_format.out&NBITS_MASK){
+ case(B08):{
+ for(i=0;i<len;i++)
+ ((uint8_t*)out_data)[i]=(uint8_t)((((uint32_t*)in_data)[i])>>24);
+ break;
+ }
+ case(B16):{
+ for(i=1;i<len;i++)
+ ((uint16_t*)out_data)[i]=(uint16_t)((((uint32_t*)in_data)[i])>>16);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Switch to the correct endainess (agiain the problem with sun?)
+ if((pl_format.out&END_MASK)!=LE){
+ switch(pl_format.in&NBITS_MASK){
+ case(B16):{
+ register uint16_t s;
+ for(i=1;i<len;i++){
+ s=((uint16_t*)out_data)[i];
+ ((uint16_t*)out_data)[i]=(uint16_t)(((s&0x00FF)<<8) | (s&0xFF00)>>8);
+ }
+ break;
+ }
+ case(B32):{
+ register uint32_t s;
+ for(i=1;i<len;i++){
+ s=((uint32_t*)out_data)[i];
+ ((uint32_t*)out_data)[i]=(uint32_t)(((s&0x000000FF)<<24) | ((s&0x0000FF00)<<8) |
+ ((s&0x00FF0000)>>8) | ((s&0xFF000000)>>24));
+ }
+ break;
+ }
+ }
+ }
+
+ ao_plugin_data.data=out_data;
return 1;
}
+
+
Index: ao_plugin.c
===================================================================
RCS file: /cvsroot/mplayer/main/libao2/ao_plugin.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ao_plugin.c 29 Nov 2001 12:44:06 -0000 1.3
+++ ao_plugin.c 3 Dec 2001 14:04:55 -0000 1.4
@@ -197,7 +197,7 @@
len=driver()->play(ao_plugin_data.data,ao_plugin_data.len,flags);
if(len!=ao_plugin_data.len)
- printf("Buffer over flow in sound plugin ");
+ fprintf(stderr,"[ao_plugin] Warning under or over flow in sound plugin");
return ret_len;
}
@@ -209,5 +209,7 @@
delay+=ao_plugin_data.delay_fix;
return delay;
}
+
+
More information about the MPlayer-cvslog
mailing list