fix segfault in the skin browser when sbSelectedSkin gets dereferenced before setting, when no skin is selected in the skin list upon opening the browser,
and "Cancel" or "OK" buttons get clicked.
Noticed when runnig freshly compiled gmplayer on a system where the skins were still under the old location.
based on a combined patch by Stanislav Maslovski <stanislav POIS maslovski AH gmail POIS com>
line source
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 /* This audio output filter changes the format of a data block. Valid
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 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.
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 */
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Must be defined before any libc headers are included!
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #define _ISOC9X_SOURCE
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #include <stdio.h>
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #include <stdlib.h>
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #include <string.h>
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #include <unistd.h>
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #include <inttypes.h>
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #include <limits.h>
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #include "af.h"
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #include "bswap.h"
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #include "libvo/fastmemcpy.h"
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Integer to float conversion through lrintf()
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #ifdef HAVE_LRINTF
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #include <math.h>
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 long int lrintf(float);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #else
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #define lrintf(x) ((int)(x))
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #endif
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 /* Functions used by play to convert the input audio to the correct
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 format */
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 /* The below includes retrives functions for converting to and from
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ulaw and alaw */
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #include "af_format_ulaw.c"
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #include "af_format_alaw.c"
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Switch endianess
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static void endian(void* in, void* out, int len, int bps);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // From singed to unsigned and the other way
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static void si2us(void* data, int len, int bps);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Change the number of bits per sample
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static void change_bps(void* in, void* out, int len, int inbps, int outbps);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // From float to int signed
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static void float2int(float* in, void* out, int len, int bps);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // From signed int to float
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static void int2float(void* in, float* out, int len, int bps);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static af_data_t* play(struct af_instance_s* af, af_data_t* data);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static af_data_t* play_swapendian(struct af_instance_s* af, af_data_t* data);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static af_data_t* play_float_s16(struct af_instance_s* af, af_data_t* data);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static af_data_t* play_s16_float(struct af_instance_s* af, af_data_t* data);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Helper functions to check sanity for input arguments
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Sanity check for bytes per sample
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static int check_bps(int bps)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if(bps != 4 && bps != 3 && bps != 2 && bps != 1){
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_msg(AF_MSG_ERROR,"[format] The number of bytes per sample"
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 " must be 1, 2, 3 or 4. Current value is %i \n",bps);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return AF_ERROR;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return AF_OK;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Check for unsupported formats
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static int check_format(int format)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 char buf[256];
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 switch(format & AF_FORMAT_SPECIAL_MASK){
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(AF_FORMAT_IMA_ADPCM):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(AF_FORMAT_MPEG2):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(AF_FORMAT_AC3):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_msg(AF_MSG_ERROR,"[format] Sample format %s not yet supported \n",
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_fmt2str(format,buf,256));
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return AF_ERROR;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return AF_OK;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Initialization and runtime control
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static int control(struct af_instance_s* af, int cmd, void* arg)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 switch(cmd){
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case AF_CONTROL_REINIT:{
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 char buf1[256];
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 char buf2[256];
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_data_t *data = arg;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Make sure this filter isn't redundant
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if(af->data->format == data->format &&
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af->data->bps == data->bps)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return AF_DETACH;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Check for errors in configuraton
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if((AF_OK != check_bps(data->bps)) ||
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 (AF_OK != check_format(data->format)) ||
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 (AF_OK != check_bps(af->data->bps)) ||
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 (AF_OK != check_format(af->data->format)))
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return AF_ERROR;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_msg(AF_MSG_VERBOSE,"[format] Changing sample format from %s to %s\n",
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_fmt2str(data->format,buf1,256),
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_fmt2str(af->data->format,buf2,256));
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af->data->rate = data->rate;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af->data->nch = data->nch;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af->mul.n = af->data->bps;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af->mul.d = data->bps;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_frac_cancel(&af->mul);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af->play = play; // set default
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // look whether only endianess differences are there
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if ((af->data->format & ~AF_FORMAT_END_MASK) ==
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 (data->format & ~AF_FORMAT_END_MASK))
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_msg(AF_MSG_VERBOSE,"[format] Accelerated endianess conversion only\n");
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af->play = play_swapendian;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if ((data->format == AF_FORMAT_FLOAT_NE) &&
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 (af->data->format == AF_FORMAT_S16_NE))
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_msg(AF_MSG_VERBOSE,"[format] Accelerated %s to %s conversion\n",
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_fmt2str(data->format,buf1,256),
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_fmt2str(af->data->format,buf2,256));
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af->play = play_float_s16;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if ((data->format == AF_FORMAT_S16_NE) &&
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 (af->data->format == AF_FORMAT_FLOAT_NE))
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_msg(AF_MSG_VERBOSE,"[format] Accelerated %s to %s conversion\n",
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_fmt2str(data->format,buf1,256),
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_fmt2str(af->data->format,buf2,256));
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af->play = play_s16_float;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return AF_OK;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case AF_CONTROL_COMMAND_LINE:{
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 int format = af_str2fmt_short(arg);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if (format == -1) {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_msg(AF_MSG_ERROR, "[format] %s is not a valid format\n", (char *)arg);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return AF_ERROR;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if(AF_OK != af->control(af,AF_CONTROL_FORMAT_FMT | AF_CONTROL_SET,&format))
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return AF_ERROR;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return AF_OK;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case AF_CONTROL_FORMAT_FMT | AF_CONTROL_SET:{
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Check for errors in configuraton
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if(AF_OK != check_format(*(int*)arg))
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return AF_ERROR;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af->data->format = *(int*)arg;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af->data->bps = af_fmt2bits(af->data->format)/8;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return AF_OK;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return AF_UNKNOWN;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Deallocate memory
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static void uninit(struct af_instance_s* af)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if(af->data)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 free(af->data);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af->setup = 0;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static af_data_t* play_swapendian(struct af_instance_s* af, af_data_t* data)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_data_t* l = af->data; // Local data
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_data_t* c = data; // Current working data
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 int len = c->len/c->bps; // Lenght in samples of current audio block
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if(AF_OK != RESIZE_LOCAL_BUFFER(af,data))
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return NULL;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 endian(c->audio,l->audio,len,c->bps);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 c->audio = l->audio;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 c->format = l->format;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return c;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static af_data_t* play_float_s16(struct af_instance_s* af, af_data_t* data)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_data_t* l = af->data; // Local data
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_data_t* c = data; // Current working data
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 int len = c->len/4; // Lenght in samples of current audio block
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if(AF_OK != RESIZE_LOCAL_BUFFER(af,data))
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return NULL;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 float2int(c->audio, l->audio, len, 2);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 c->audio = l->audio;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 c->len = len*2;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 c->bps = 2;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 c->format = l->format;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return c;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static af_data_t* play_s16_float(struct af_instance_s* af, af_data_t* data)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_data_t* l = af->data; // Local data
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_data_t* c = data; // Current working data
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 int len = c->len/2; // Lenght in samples of current audio block
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if(AF_OK != RESIZE_LOCAL_BUFFER(af,data))
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return NULL;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 int2float(c->audio, l->audio, len, 2);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 c->audio = l->audio;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 c->len = len*4;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 c->bps = 4;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 c->format = l->format;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return c;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Filter data through filter
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static af_data_t* play(struct af_instance_s* af, af_data_t* data)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_data_t* l = af->data; // Local data
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_data_t* c = data; // Current working data
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 int len = c->len/c->bps; // Lenght in samples of current audio block
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if(AF_OK != RESIZE_LOCAL_BUFFER(af,data))
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return NULL;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Change to cpu native endian format
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if((c->format&AF_FORMAT_END_MASK)!=AF_FORMAT_NE)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 endian(c->audio,c->audio,len,c->bps);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Conversion table
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if((c->format & AF_FORMAT_SPECIAL_MASK) == AF_FORMAT_MU_LAW) {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 from_ulaw(c->audio, l->audio, len, l->bps, l->format&AF_FORMAT_POINT_MASK);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if(AF_FORMAT_A_LAW == (l->format&AF_FORMAT_SPECIAL_MASK))
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 to_ulaw(l->audio, l->audio, len, 1, AF_FORMAT_SI);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if((l->format&AF_FORMAT_SIGN_MASK) == AF_FORMAT_US)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 si2us(l->audio,len,l->bps);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 } else if((c->format & AF_FORMAT_SPECIAL_MASK) == AF_FORMAT_A_LAW) {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 from_alaw(c->audio, l->audio, len, l->bps, l->format&AF_FORMAT_POINT_MASK);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if(AF_FORMAT_A_LAW == (l->format&AF_FORMAT_SPECIAL_MASK))
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 to_alaw(l->audio, l->audio, len, 1, AF_FORMAT_SI);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if((l->format&AF_FORMAT_SIGN_MASK) == AF_FORMAT_US)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 si2us(l->audio,len,l->bps);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 } else if((c->format & AF_FORMAT_POINT_MASK) == AF_FORMAT_F) {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 switch(l->format&AF_FORMAT_SPECIAL_MASK){
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(AF_FORMAT_MU_LAW):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 to_ulaw(c->audio, l->audio, len, c->bps, c->format&AF_FORMAT_POINT_MASK);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(AF_FORMAT_A_LAW):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 to_alaw(c->audio, l->audio, len, c->bps, c->format&AF_FORMAT_POINT_MASK);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 default:
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 float2int(c->audio, l->audio, len, l->bps);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if((l->format&AF_FORMAT_SIGN_MASK) == AF_FORMAT_US)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 si2us(l->audio,len,l->bps);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 } else {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Input must be int
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Change signed/unsigned
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if((c->format&AF_FORMAT_SIGN_MASK) != (l->format&AF_FORMAT_SIGN_MASK)){
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 si2us(c->audio,len,c->bps);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Convert to special formats
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 switch(l->format&(AF_FORMAT_SPECIAL_MASK|AF_FORMAT_POINT_MASK)){
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(AF_FORMAT_MU_LAW):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 to_ulaw(c->audio, l->audio, len, c->bps, c->format&AF_FORMAT_POINT_MASK);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(AF_FORMAT_A_LAW):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 to_alaw(c->audio, l->audio, len, c->bps, c->format&AF_FORMAT_POINT_MASK);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(AF_FORMAT_F):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 int2float(c->audio, l->audio, len, c->bps);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 default:
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Change the number of bits
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if(c->bps != l->bps)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 change_bps(c->audio,l->audio,len,c->bps,l->bps);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 else
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 memcpy(l->audio,c->audio,len*c->bps);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Switch from cpu native endian to the correct endianess
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if((l->format&AF_FORMAT_END_MASK)!=AF_FORMAT_NE)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 endian(l->audio,l->audio,len,l->bps);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Set output data
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 c->audio = l->audio;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 c->len = len*l->bps;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 c->bps = l->bps;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 c->format = l->format;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return c;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Allocate memory and set function pointers
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static int open(af_instance_t* af){
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af->control=control;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af->uninit=uninit;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af->play=play;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af->mul.n=1;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af->mul.d=1;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af->data=calloc(1,sizeof(af_data_t));
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if(af->data == NULL)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return AF_ERROR;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return AF_OK;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Description of this filter
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 af_info_t af_info_format = {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 "Sample format conversion",
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 "format",
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 "Anders",
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 "",
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 AF_FLAGS_REENTRANT,
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 open
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 };
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static inline uint32_t load24bit(void* data, int pos) {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #if WORDS_BIGENDIAN
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return (((uint32_t)((uint8_t*)data)[3*pos])<<24) |
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 (((uint32_t)((uint8_t*)data)[3*pos+1])<<16) |
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 (((uint32_t)((uint8_t*)data)[3*pos+2])<<8);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #else
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 return (((uint32_t)((uint8_t*)data)[3*pos])<<8) |
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 (((uint32_t)((uint8_t*)data)[3*pos+1])<<16) |
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 (((uint32_t)((uint8_t*)data)[3*pos+2])<<24);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #endif
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static inline void store24bit(void* data, int pos, uint32_t expanded_value) {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #if WORDS_BIGENDIAN
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((uint8_t*)data)[3*pos]=expanded_value>>24;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((uint8_t*)data)[3*pos+1]=expanded_value>>16;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((uint8_t*)data)[3*pos+2]=expanded_value>>8;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #else
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((uint8_t*)data)[3*pos]=expanded_value>>8;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((uint8_t*)data)[3*pos+1]=expanded_value>>16;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((uint8_t*)data)[3*pos+2]=expanded_value>>24;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #endif
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 // Function implementations used by play
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static void endian(void* in, void* out, int len, int bps)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 register int i;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 switch(bps){
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(2):{
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++){
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((uint16_t*)out)[i]=bswap_16(((uint16_t*)in)[i]);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(3):{
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 register uint8_t s;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++){
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 s=((uint8_t*)in)[3*i];
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((uint8_t*)out)[3*i]=((uint8_t*)in)[3*i+2];
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if (in != out)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((uint8_t*)out)[3*i+1]=((uint8_t*)in)[3*i+1];
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((uint8_t*)out)[3*i+2]=s;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(4):{
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++){
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((uint32_t*)out)[i]=bswap_32(((uint32_t*)in)[i]);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static void si2us(void* data, int len, int bps)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 register long i = -(len * bps);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 register uint8_t *p = &((uint8_t *)data)[len * bps];
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #if AF_FORMAT_NE == AF_FORMAT_LE
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 p += bps - 1;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 #endif
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 if (len <= 0) return;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 do {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 p[i] ^= 0x80;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 } while (i += bps);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static void change_bps(void* in, void* out, int len, int inbps, int outbps)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 register int i;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 switch(inbps){
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(1):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 switch(outbps){
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(2):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((uint16_t*)out)[i]=((uint16_t)((uint8_t*)in)[i])<<8;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(3):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 store24bit(out, i, ((uint32_t)((uint8_t*)in)[i])<<24);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(4):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((uint32_t*)out)[i]=((uint32_t)((uint8_t*)in)[i])<<24;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(2):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 switch(outbps){
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(1):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((uint8_t*)out)[i]=(uint8_t)((((uint16_t*)in)[i])>>8);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(3):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 store24bit(out, i, ((uint32_t)((uint16_t*)in)[i])<<16);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(4):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((uint32_t*)out)[i]=((uint32_t)((uint16_t*)in)[i])<<16;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(3):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 switch(outbps){
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(1):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((uint8_t*)out)[i]=(uint8_t)(load24bit(in, i)>>24);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(2):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((uint16_t*)out)[i]=(uint16_t)(load24bit(in, i)>>16);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(4):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((uint32_t*)out)[i]=(uint32_t)load24bit(in, i);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(4):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 switch(outbps){
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(1):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((uint8_t*)out)[i]=(uint8_t)((((uint32_t*)in)[i])>>24);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(2):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((uint16_t*)out)[i]=(uint16_t)((((uint32_t*)in)[i])>>16);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(3):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 store24bit(out, i, ((uint32_t*)in)[i]);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static void float2int(float* in, void* out, int len, int bps)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 register int i;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 switch(bps){
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(1):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((int8_t*)out)[i] = lrintf(127.0 * in[i]);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(2):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((int16_t*)out)[i] = lrintf(32767.0 * in[i]);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(3):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 store24bit(out, i, lrintf(2147483647.0 * in[i]));
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(4):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 ((int32_t*)out)[i] = lrintf(2147483647.0 * in[i]);
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 static void int2float(void* in, float* out, int len, int bps)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 {
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 register int i;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 switch(bps){
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(1):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 out[i]=(1.0/128.0)*((int8_t*)in)[i];
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(2):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 out[i]=(1.0/32768.0)*((int16_t*)in)[i];
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(3):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 out[i]=(1.0/2147483648.0)*((int32_t)load24bit(in, i));
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 case(4):
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 for(i=0;i<len;i++)
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 out[i]=(1.0/2147483648.0)*((int32_t*)in)[i];
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 break;
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }
+ 鐃緒申��申鐃初姐�渇����鐃醇�鐃緒申��申鐃緒申 }