/*
* network_speex.cpp
* created for Marathon: Aleph One
Copyright (C) 2003 and beyond by Gregory Smith
and the "Aleph One" developers.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
This license is contained in the file "COPYING",
which is included with this source code; it is available online at
http://www.gnu.org/licenses/gpl.html
speex encoder / decoder functions
*/
#if !defined(DISABLE_NETWORKING)
#include "cseries.h"
#ifdef SPEEX
#include "network_speex.h"
#include "network_audio_shared.h"
#include "preferences.h"
#include
void *gEncoderState = 0;
SpeexBits gEncoderBits;
SpeexPreprocessState *gPreprocessState = 0;
void *gDecoderState = 0;
SpeexBits gDecoderBits;
void init_speex_encoder() {
if (!gEncoderState) {
gEncoderState = speex_encoder_init(&speex_nb_mode);
int quality = 3; // 8000 bps
speex_encoder_ctl(gEncoderState, SPEEX_SET_QUALITY, &quality);
int complexity = 4; // net play is demanding, ok?
speex_encoder_ctl(gEncoderState, SPEEX_SET_COMPLEXITY, &complexity);
int tmp = kNetworkAudioSampleRate;
speex_encoder_ctl(gEncoderState, SPEEX_SET_SAMPLING_RATE, &tmp);
speex_bits_init(&gEncoderBits);
// set up the preprocessor
int frame_size;
speex_encoder_ctl(gEncoderState, SPEEX_GET_FRAME_SIZE, &frame_size);
gPreprocessState = speex_preprocess_state_init(frame_size, kNetworkAudioSampleRate);
// turn on AGC and denoise
tmp = 1;
speex_preprocess_ctl(gPreprocessState, SPEEX_PREPROCESS_SET_DENOISE, &tmp);
tmp = 1;
speex_preprocess_ctl(gPreprocessState, SPEEX_PREPROCESS_SET_AGC, &tmp);
float agc_level = 32768.0 * 0.7;
speex_preprocess_ctl(gPreprocessState, SPEEX_PREPROCESS_SET_AGC_LEVEL, &agc_level);
}
}
void destroy_speex_encoder() {
if (gEncoderState != NULL) {
speex_encoder_destroy(gEncoderState);
speex_bits_destroy(&gEncoderBits);
gEncoderState = NULL;
}
if (gPreprocessState)
{
speex_preprocess_state_destroy(gPreprocessState);
gPreprocessState = 0;
}
}
void init_speex_decoder() {
if (gDecoderState == NULL) {
gDecoderState = speex_decoder_init(&speex_nb_mode);
int tmp = 1;
speex_decoder_ctl(gDecoderState, SPEEX_SET_ENH, &tmp);
tmp = kNetworkAudioSampleRate;
speex_decoder_ctl(gDecoderState, SPEEX_SET_SAMPLING_RATE, &tmp);
speex_bits_init(&gDecoderBits);
}
}
void destroy_speex_decoder() {
if (gDecoderState != NULL) {
speex_decoder_destroy(gDecoderState);
speex_bits_destroy(&gDecoderBits);
gDecoderState = NULL;
}
}
#endif //def SPEEX
#endif // !defined(DISABLE_NETWORKING)