2014-01-11 14 views
2

Я пытаюсь перепрограммировать захваченный 2channel/48khz/32bit audio в 1channel/8khz/32bit с использованием libsamplerate в проекте телефона Windows с использованием WASAPI.Resample audio с использованием libsamplerate в Windows Phone

мне нужно получить 160 кадров из 960 оригинальных кадров, повторно sampling.After захвата звука не используя GetBuffer метод, который я отправить захваченное BYTE массив 7680 байта ниже способом:

void BackEndAudio::ChangeSampleRate(BYTE* buf) 
{ 

int er2; 
st=src_new(2,1,&er2); 
//SRC_DATA sd defined before 
sd=new SRC_DATA; 


BYTE *onechbuf = new BYTE[3840]; 
int outputIndex = 0; 

//convert Stereo to Mono 
for (int n = 0; n < 7680; n+=8) 
{ 
    onechbuf[outputIndex++] = buf[n]; 
    onechbuf[outputIndex++] = buf[n+1]; 
    onechbuf[outputIndex++] = buf[n+2]; 
    onechbuf[outputIndex++] = buf[n+3]; 
} 

float *res1=new float[960]; 
res1=(float *)onechbuf; 

float *res2=new float[160]; 

//change samplerate 
sd->data_in=res1; 
sd->data_out=res2; 
sd->input_frames=960; 
sd->output_frames=160; 
sd->src_ratio=(double)1/6; 
sd->end_of_input=1; 
int er=src_process(st,sd); 

transportController->WriteAudio((BYTE *)res2,640); 

delete[] onechbuf; 
src_delete(st); 
delete sd; 

} 

метод src_process возвращает нет ошибка и sd->input_frames_used установлена ​​в 960 и sd->output_frames_gen установлена ​​в 159, но выход рендеринга - только шум. Я использую код в приложении VoIP в реальном времени. Что может быть источником проблемы?

+1

Вы сначала конвертировали из целых чисел в float? Значит, 'buf' содержит целые выборки или образцы с плавающей точкой? –

+1

У вас есть утечка памяти здесь: 'float * res1 = new float [960];' потому что вы переназначаете 'res1' сразу после этого, теряя единственный указатель на выделенную память. – Nabla

+0

@Nabla Спасибо за ваш намек. Я не очень хорошо C++. Но я не думаю, что это главная проблема. – harsini

ответ

1

Я нашел problem.I не должен создать новый объект SRC_STATE и удалить его в каждом вызове моей функции, вызвав st=src_new(2,1,&er2); и src_delete(st); но называть их достаточно один раз для всего аудио повторного sampling.Also нет необходимо использовать указатель для SRC_DATA. Я изменил свой код, как показано ниже, и теперь он отлично работает.

void BackEndAudio::ChangeSampleRate(BYTE* buf) 
{ 
BYTE *onechbuf = new BYTE[3840]; 
int outputIndex = 0; 

//convert Stereo to Mono 
for (int n = 0; n < 7680; n+=8) 
{ 
    onechbuf[outputIndex++] = buf[n]; 
    onechbuf[outputIndex++] = buf[n+1]; 
    onechbuf[outputIndex++] = buf[n+2]; 
    onechbuf[outputIndex++] = buf[n+3]; 
} 

float *out=new float[160]; 

//change samplerate 
sd.data_in=(float *)onechbuf; 
sd.data_out=out; 
sd.input_frames=960; 
sd.output_frames=160; 
sd.src_ratio=(double)1/6; 
sd.end_of_input=0; 
int er=src_process(st,&sd); 
}