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

📄 af_extrastereo.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
字号:
/*=============================================================================//	//  This software has been released under the terms of the GNU General Public//  license. See http://www.gnu.org/copyleft/gpl.html for details.////  Copyright 2004 Alex Beregszaszi & Pierre Lombard////=============================================================================*/#include <stdio.h>#include <stdlib.h>#include <string.h> #include <unistd.h>#include <inttypes.h>#include <math.h>#include <limits.h>#include "af.h"// Data for specific instances of this filtertypedef struct af_extrastereo_s{    float mul;}af_extrastereo_t;static af_data_t* play_s16(struct af_instance_s* af, af_data_t* data);static af_data_t* play_float(struct af_instance_s* af, af_data_t* data);// Initialization and runtime controlstatic int control(struct af_instance_s* af, int cmd, void* arg){  af_extrastereo_t* s   = (af_extrastereo_t*)af->setup;   switch(cmd){  case AF_CONTROL_REINIT:{    // Sanity check    if(!arg) return AF_ERROR;        af->data->rate   = ((af_data_t*)arg)->rate;    af->data->nch    = 2;    if (((af_data_t*)arg)->format == AF_FORMAT_FLOAT_NE)    {	af->data->format = AF_FORMAT_FLOAT_NE;	af->data->bps = 4;	af->play = play_float;    }// else    {	af->data->format = AF_FORMAT_S16_NE;	af->data->bps = 2;	af->play = play_s16;    }    return af_test_output(af,(af_data_t*)arg);  }  case AF_CONTROL_COMMAND_LINE:{    float f;    sscanf((char*)arg,"%f", &f);    s->mul = f;    return AF_OK;  }  case AF_CONTROL_ES_MUL | AF_CONTROL_SET:    s->mul = *(float*)arg;    return AF_OK;  case AF_CONTROL_ES_MUL | AF_CONTROL_GET:    *(float*)arg = s->mul;    return AF_OK;  }  return AF_UNKNOWN;}// Deallocate memory static void uninit(struct af_instance_s* af){  if(af->data)    free(af->data);  if(af->setup)    free(af->setup);}// Filter data through filterstatic af_data_t* play_s16(struct af_instance_s* af, af_data_t* data){  af_extrastereo_t *s = af->setup;  register int i = 0;  int16_t *a = (int16_t*)data->audio;	// Audio data  int len = data->len/2;		// Number of samples  int avg, l, r;    for (i = 0; i < len; i+=2)  {    avg = (a[i] + a[i + 1]) / 2;        l = avg + (int)(s->mul * (a[i] - avg));    r = avg + (int)(s->mul * (a[i + 1] - avg));    a[i] = clamp(l, SHRT_MIN, SHRT_MAX);    a[i + 1] = clamp(r, SHRT_MIN, SHRT_MAX);  }  return data;}static af_data_t* play_float(struct af_instance_s* af, af_data_t* data){  af_extrastereo_t *s = af->setup;  register int i = 0;  float *a = (float*)data->audio;	// Audio data  int len = data->len/4;		// Number of samples  float avg, l, r;    for (i = 0; i < len; i+=2)  {    avg = (a[i] + a[i + 1]) / 2;        l = avg + (s->mul * (a[i] - avg));    r = avg + (s->mul * (a[i + 1] - avg));        a[i] = af_softclip(l);    a[i + 1] = af_softclip(r);  }  return data;}// Allocate memory and set function pointersstatic int open(af_instance_t* af){  af->control=control;  af->uninit=uninit;  af->play=play_s16;  af->mul.n=1;  af->mul.d=1;  af->data=calloc(1,sizeof(af_data_t));  af->setup=calloc(1,sizeof(af_extrastereo_t));  if(af->data == NULL || af->setup == NULL)    return AF_ERROR;  ((af_extrastereo_t*)af->setup)->mul = 2.5;  return AF_OK;}// Description of this filteraf_info_t af_info_extrastereo = {    "Extra stereo",    "extrastereo",    "Alex Beregszaszi & Pierre Lombard",    "",    AF_FLAGS_NOT_REENTRANT,    open};

⌨️ 快捷键说明

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