diff --git a/linphone/mediastreamer2/include/mediastreamer2/mediastream.h b/linphone/mediastreamer2/include/mediastreamer2/mediastream.h index 73335a9d3648bfa3af26652b2832c0844bcf40e8..bdc3eff71d7ea56a19df0c88fc328111defd4691 100644 --- a/linphone/mediastreamer2/include/mediastreamer2/mediastream.h +++ b/linphone/mediastreamer2/include/mediastreamer2/mediastream.h @@ -117,7 +117,7 @@ void audio_stream_set_mic_gain(AudioStream *stream, float gain); /*enable parametric equalizer in the stream that goes to the speaker*/ void audio_stream_enable_equalizer(AudioStream *stream, bool_t enabled); -void audio_stream_equalizer_set_gain(AudioStream *stream, int frequency, float gain); +void audio_stream_equalizer_set_gain(AudioStream *stream, int frequency, float gain, int freq_width); /* stop the audio streaming thread and free everything*/ void audio_stream_stop (AudioStream * stream); diff --git a/linphone/mediastreamer2/include/mediastreamer2/msequalizer.h b/linphone/mediastreamer2/include/mediastreamer2/msequalizer.h index 4dbdfc8be912a5bea87d9e794003b4cd87a18f60..cebecaaf3a0c2aa97ca8f447871abb3f838e6f76 100644 --- a/linphone/mediastreamer2/include/mediastreamer2/msequalizer.h +++ b/linphone/mediastreamer2/include/mediastreamer2/msequalizer.h @@ -28,9 +28,17 @@ typedef struct _MSEqualizerGain{ float width; ///< frequency band width around mid frequency for which the gain is applied, in Hz. Use 0 for the lowest frequency resolution. }MSEqualizerGain; -#define MS_EQUALIZER_SET_GAIN MS_FILTER_METHOD(MS_EQUALIZER_ID,0,MSEqualizerGain) -#define MS_EQUALIZER_GET_GAIN MS_FILTER_METHOD(MS_EQUALIZER_ID,1,MSEqualizerGain) -#define MS_EQUALIZER_SET_ACTIVE MS_FILTER_METHOD(MS_EQUALIZER_ID,2,int) +#define MS_EQUALIZER_SET_GAIN MS_FILTER_METHOD(MS_EQUALIZER_ID,0,MSEqualizerGain) +#define MS_EQUALIZER_GET_GAIN MS_FILTER_METHOD(MS_EQUALIZER_ID,1,MSEqualizerGain) +#define MS_EQUALIZER_SET_ACTIVE MS_FILTER_METHOD(MS_EQUALIZER_ID,2,int) +/**dump the spectral response into a table of float. The table must be sized according to the value returned by + * MS_EQUALIZER_GET_NUM_FREQUENCIES +**/ +#define MS_EQUALIZER_DUMP_STATE MS_FILTER_METHOD(MS_EQUALIZER_ID,3,float) + +/**returns the number of frequencies*/ +#define MS_EQUALIZER_GET_NUM_FREQUENCIES MS_FILTER_METHOD(MS_EQUALIZER_ID,4,int) + #endif diff --git a/linphone/mediastreamer2/src/audiostream.c b/linphone/mediastreamer2/src/audiostream.c index 8182c326f0a1d07f8507fa9b0dfcbcade64c5957..6105140c73167f84eaa0db5700e24f85e08eb62f 100644 --- a/linphone/mediastreamer2/src/audiostream.c +++ b/linphone/mediastreamer2/src/audiostream.c @@ -452,12 +452,12 @@ void audio_stream_enable_equalizer(AudioStream *stream, bool_t enabled){ } } -void audio_stream_equalizer_set_gain(AudioStream *stream, int frequency, float gain){ +void audio_stream_equalizer_set_gain(AudioStream *stream, int frequency, float gain, int freq_width){ if (stream->equalizer){ MSEqualizerGain d; d.frequency=frequency; d.gain=gain; - d.width=0.4*(float)frequency; + d.width=freq_width; ms_filter_call_method(stream->equalizer,MS_EQUALIZER_SET_GAIN,&d); } } diff --git a/linphone/mediastreamer2/src/equalizer.c b/linphone/mediastreamer2/src/equalizer.c index c48c2c2a35f2c01650f823ba8b7c9dfcb5edd9c1..e6c75548ce414aeaf66f8d79ea315f7f8a8034d3 100644 --- a/linphone/mediastreamer2/src/equalizer.c +++ b/linphone/mediastreamer2/src/equalizer.c @@ -217,15 +217,15 @@ static void equalizer_state_run(EqualizerState *s, int16_t *samples, int nsample } -void equalizer_init(MSFilter *f){ +static void equalizer_init(MSFilter *f){ f->data=equalizer_state_new(128); } -void equalizer_uninit(MSFilter *f){ +static void equalizer_uninit(MSFilter *f){ equalizer_state_destroy((EqualizerState*)f->data); } -void equalizer_process(MSFilter *f){ +static void equalizer_process(MSFilter *f){ mblk_t *m; EqualizerState *s=(EqualizerState*)f->data; while((m=ms_queue_get(f->inputs[0]))!=NULL){ @@ -236,14 +236,14 @@ void equalizer_process(MSFilter *f){ } } -int equalizer_set_gain(MSFilter *f, void *data){ +static int equalizer_set_gain(MSFilter *f, void *data){ EqualizerState *s=(EqualizerState*)f->data; MSEqualizerGain *d=(MSEqualizerGain*)data; equalizer_state_set(s,d->frequency,d->gain,d->width); return 0; } -int equalizer_get_gain(MSFilter *f, void *data){ +static int equalizer_get_gain(MSFilter *f, void *data){ EqualizerState *s=(EqualizerState*)f->data; MSEqualizerGain *d=(MSEqualizerGain*)data; d->gain=equalizer_state_get(s,d->frequency); @@ -251,23 +251,44 @@ int equalizer_get_gain(MSFilter *f, void *data){ return 0; } -int equalizer_set_rate(MSFilter *f, void *data){ +static int equalizer_set_rate(MSFilter *f, void *data){ EqualizerState *s=(EqualizerState*)f->data; s->rate=*(int*)data; return 0; } -int equalizer_set_active(MSFilter *f, void *data){ +static int equalizer_set_active(MSFilter *f, void *data){ EqualizerState *s=(EqualizerState*)f->data; s->active=*(int*)data; return 0; } +static int equalizer_dump(MSFilter *f, void *data){ + EqualizerState *s=(EqualizerState*)f->data; + float *t=(float*)data; + int i; + *t=s->fft_cpx[0]; + t++; + for (i=1;i<s->nfft;i+=2){ + *t=((float)s->fft_cpx[i]*(float)s->nfft)/(float)GAIN_ZERODB; + t++; + } + return 0; +} + +static int equalizer_get_nfreqs(MSFilter *f, void *data){ + EqualizerState *s=(EqualizerState*)f->data; + *(int*)data=s->nfft/2; + return 0; +} + static MSFilterMethod equalizer_methods[]={ { MS_EQUALIZER_SET_GAIN , equalizer_set_gain }, { MS_EQUALIZER_GET_GAIN , equalizer_get_gain }, { MS_EQUALIZER_SET_ACTIVE , equalizer_set_active }, { MS_FILTER_SET_SAMPLE_RATE , equalizer_set_rate }, + { MS_EQUALIZER_DUMP_STATE , equalizer_dump }, + { MS_EQUALIZER_GET_NUM_FREQUENCIES, equalizer_get_nfreqs }, { 0 , NULL } }; diff --git a/linphone/mediastreamer2/tests/mediastream.c b/linphone/mediastreamer2/tests/mediastream.c index 1c8dfab2857f6d20a05c260e040dc4327716c2b3..b02df047e968dbc7bf6225736d66d6ba4c56d81a 100644 --- a/linphone/mediastreamer2/tests/mediastream.c +++ b/linphone/mediastreamer2/tests/mediastream.c @@ -21,7 +21,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "mediastreamer-config.h" #endif +#include <math.h> + #include "mediastreamer2/mediastream.h" +#include "mediastreamer2/msequalizer.h" #ifdef VIDEO_ENABLED #include "mediastreamer2/msv4l.h" #endif @@ -290,14 +293,29 @@ void run_media_streams(int localport, const char *remote_ip, int remoteport, in commands[127]='\0'; printf("Please enter equalizer requests, such as 'eq active 1', 'eq active 0', 'eq 1200 0.1'\n"); while(fgets(commands,sizeof(commands)-1,stdin)!=NULL){ - int active,freq; + int active,freq,freq_width; float gain; if (sscanf(commands,"eq active %i",&active)==1){ audio_stream_enable_equalizer(audio,active); printf("OK\n"); - }else if (sscanf(commands,"eq %i %f",&freq,&gain)==2){ - audio_stream_equalizer_set_gain(audio,freq,gain); + }else if (sscanf(commands,"eq %i:%f:%i",&freq,&gain,&freq_width)==3){ + audio_stream_equalizer_set_gain(audio,freq,gain,freq_width); + printf("OK\n"); + }else if (sscanf(commands,"eq %i:%f",&freq,&gain)==2){ + audio_stream_equalizer_set_gain(audio,freq,gain,0); printf("OK\n"); + }else if (strstr(commands,"dump")){ + int n=0,i; + float *t; + ms_filter_call_method(audio->equalizer,MS_EQUALIZER_GET_NUM_FREQUENCIES,&n); + t=(float*)alloca(sizeof(float)*n); + ms_filter_call_method(audio->equalizer,MS_EQUALIZER_DUMP_STATE,t); + for(i=0;i<n;++i){ + if (fabs(t[i]-1)>0.01){ + printf("%i:%f:0 ",(i*pt->clock_rate)/(2*n),t[i]); + } + } + printf("\nOK\n"); }else if (strstr(commands,"quit")){ break; }else printf("Cannot understand this.\n");