static unsigned int get_supported_rate(unsigned int prefered_rate) { JNIEnv *jni_env = ms_get_jni_env(); jclass audio_record_class = jni_env->FindClass("android/media/AudioRecord"); int size = jni_env->CallStaticIntMethod(audio_record_class ,jni_env->GetStaticMethodID(audio_record_class,"getMinBufferSize", "(III)I") ,prefered_rate ,2/*CHANNEL_CONFIGURATION_MONO*/ ,2/* ENCODING_PCM_16BIT */); if (size > 0) { return prefered_rate; } else { ms_warning("Cannot configure recorder with rate [%i]",prefered_rate); if (prefered_rate>48000) { return get_supported_rate(48000); } switch (prefered_rate) { case 12000: case 24000: return get_supported_rate(48000); case 48000: return get_supported_rate(44100); case 44100: return get_supported_rate(16000); case 16000: return get_supported_rate(8000); default: { ms_error("This Android sound card doesn't support any standard sample rate"); return 0; } } return 0; } }
/***********************************read filter********************/ static int set_read_rate(MSFilter *f, void *arg){ unsigned int proposed_rate = *((unsigned int*)arg); ms_debug("set_rate %d",proposed_rate); msandroid_sound_data *d=(msandroid_sound_data*)f->data; d->rate=get_supported_rate(proposed_rate); if (d->rate == proposed_rate) return 0; else return -1; }
/***********************************read filter********************/ static int set_read_rate(MSFilter *f, void *arg){ unsigned int proposed_rate = *((unsigned int*)arg); ms_debug("set_rate %d",proposed_rate); msandroid_sound_data *d=(msandroid_sound_data*)f->data; if (d->forced_rate) { ms_warning("sample rate is forced by mediastreamer2 device table, skipping..."); return -1; } d->rate=get_supported_rate(proposed_rate); if (d->rate == proposed_rate) return 0; else return -1; }