2012-06-12 22 views
5

tôi đã cố gắng để có được giao diện SLDeviceVolumeItf của RecorderObject trên Android nhưng tôi đã nhận lỗi: SL_RESULT_FEATURE_UNSUPPORTED.RecorderObject trong OpenSL không thực hiện giao diện để cài đặt âm lượng hoặc cấu hình trên Android

Tôi đọc mà thi hành Android của OpenSL ES không hỗ trợ cài đặt âm lượng cho AudioRecorder. Điều đó có đúng không?

Nếu có thì có cách giải quyết khác không? Tôi có một ứng dụng VOIP mà không phải lo lắng tốt trên Galaxy Nexus vì độ lợi mic rất cao.

Tôi cũng đã cố gắng để có được SL_IID_ANDROIDCONFIGURATION để đặt streamType thành nguồn âm thanh VOICE_COMMUNINCATION mới nhưng một lần nữa tôi gặp lỗi 12 (không được hỗ trợ).

// create audio recorder 
const SLInterfaceID id[2] = { SL_IID_ANDROIDSIMPLEBUFFERQUEUE, SL_IID_ANDROIDCONFIGURATION }; 
const SLboolean req[2] = { SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE }; 

result = (*engine)->CreateAudioRecorder(engine, &recorderObject, &audioSrc, &audioSnk, 2, id, req); 
if (SL_RESULT_SUCCESS != result) { 
    return false; 
} 

SLAndroidConfigurationItf recorderConfig; 
result = (*recorderObject)->GetInterface(recorderObject, SL_IID_ANDROIDCONFIGURATION, &recorderConfig); 
if(result != SL_RESULT_SUCCESS) { 
    error("failed to get SL_IID_ANDROIDCONFIGURATION interface. e == %d", result); 
} 

Máy ghi được tạo ra nhưng tôi không thể có giao diện SL_IID_ANDROIDCONFIGURATION. Tôi đã thử trên Galaxy Nexus (ICS), cảm giác HTC (ICS) và Motorola Blur (Gingerbread). Tôi đang sử dụng phiên bản NDK 6.

Trả lời

1

Bây giờ tôi có thể nhận giao diện. Tôi đã phải sử dụng NDK 8 và target-14. Khi tôi cố gắng sử dụng 10 làm mục tiêu, tôi đã gặp lỗi khi biên dịch mã gốc (không tìm thấy dirent.h). Tôi đã phải sử dụng target-platform-14.

+0

Âm thanh lạ. Tôi sử dụng target = android-9 và làm những việc tương tự bạn làm, nhưng giao diện SLAndroidConfigurationItf được truy xuất thành công. Có thể đó là do params bạn sử dụng để tạo đối tượng ghi? –

0

Tôi đã gặp sự cố tương tự. Kết quả của tôi đã trả lại mã lỗi cho không được triển khai. Tuy nhiên, vấn đề của tôi là tôi không tạo ra máy ghi với cờ giao diện SL_IID_ANDROIDCONFIGURATION.

0
apiLvl = (*env)->GetStaticIntField(env, versionClass, sdkIntFieldID); 

SLint32 streamType = SL_ANDROID_RECORDING_PRESET_GENERIC; 
    if(apiLvl > 10){ 
     streamType = SL_ANDROID_RECORDING_PRESET_VOICE_COMMUNICATION; 
     I("set SL_ANDROID_RECORDING_PRESET_VOICE_COMMUNICATION"); 
    } 

    result = (*recorderConfig)->SetConfiguration(recorderConfig, SL_ANDROID_KEY_RECORDING_PRESET, &streamType, sizeof(SLint32)); 
    if (SL_RESULT_SUCCESS != result) { 
     return 0; 
    } 
0

Thậm chí tôi đã cố tìm cách thay đổi độ lợi trong OpenSL, có vẻ như không có api/giao diện cho điều đó. tôi thực hiện một công việc xung quanh bằng cách thực hiện một cách đơn giản tăng sự thay đổi nhân

trống multiply_gain (void * buffer, int byte, int gain_val) { int i = 0, j = 0;

 short *buffer_samples = (short*)buffer; 

    for(i = 0, j = 0; i < bytes; i+=2,j++) 
    { 
     buffer_samples[j] = (buffer_samples[j] >> gain_val); 
    } 

}

Nhưng ở đây mức tăng được nhân/chia (dựa trên < < hoặc >>) bởi một yếu tố hoặc 2. nếu bạn cần một đường cong lợi mượt mà hơn, bạn cần phải viết một phức tạp hơn chức năng tăng kỹ thuật số.

Các vấn đề liên quan