2012-06-25 31 views
17

Tôi đã đọc API Android và đã thử tìm kiếm trên internet về việc khai báo một tuỳ chỉnh audioSessionId và sau đó sử dụng audioSessionId để khởi tạo lớp AudioFx và gán MediaPlayer hoặc AudioTrack của mình mã cứng audioSessionId.Sử dụng giá trị audioSessionId để khởi tạo lớp AudioFx?

Phương pháp này sẽ cho phép tôi tạo AudioFx trước và sau đó đính kèm MediaPlayer hoặc AudioTrack mới vào số audioSessionId này.

Tôi hiện có thể sử dụng phương pháp này trên Android 2.3.6 nhưng trên Android 4.x Tôi đang gặp sự cố với lỗi khởi tạo không thành công hoặc trên các thiết bị ICS/JellyBean khác lỗi này là im lặng nhưng gọi hàm dẫn đến ngoại lệ.

Samsung Galaxy S II [Android 4.0.3]:[Issue không còn xảy ra với Android 4.0.4]

E/AudioEffect(13250): set(): AudioFlinger could not create effect, status: -38 
E/AudioEffects-JNI(13250): AudioEffect initCheck failed -5 
E/AudioEffect-JAVA(13250): Error code -5 when initializing AudioEffect. 
W/WrapEqualizer(13250): createEqualizer() -> Effect library not loaded 

Motorola Xoom [Android 4.1.2]
Thất bại nó dường như âm thầm sau khi các nhà xây dựng. Sau đó, gọi trên getProperties() nó bị treo.

java.lang.RuntimeException: AudioEffect: set/get parameter error 
    at android.media.audiofx.AudioEffect.checkStatus(AudioEffect.java:1247) 
    at android.media.audiofx.Equalizer.getProperties(Equalizer.java:532) 

Nexus 4 [Android 4.2.1]
Sử dụng audioSessionId = 0 tất cả mọi thứ hoạt động tốt nhưng sử dụng bất kỳ số khác thiết bị sẽ báo cáo lỗi im lặng sau mỗi khi tôi cố gắng thay đổi cài đặt trước, mức độ ban nhạc , tăng âm trầm để BẬT hoặc Ảo hóa thành BẬT. ID hiệu ứng được báo cáo khác nhau tùy thuộc vào FX tôi đang cố sửa đổi.

W/AudioPolicyManagerBase(165): unregisterEffect() unknown effect ID 1381 

Update 08/11/12:
Tôi có thể sử dụng audioSessionId như 0. Tôi biết nó bị phản đối nhưng nó hoạt động bằng cách sử dụng phép. <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> Tôi có nên sử dụng AudioFx với id phiên âm thanh 0 không?

+1

Nếu bạn bỏ phiếu ít nhất có thời gian để nhận xét lý do bạn bỏ phiếu! – Jona

+0

Một người nào đó đã đi xung quanh downvoting mỗi câu hỏi bounty'd và câu trả lời của nó ... Tôi thực sự hy vọng họ bị cấm. – Eric

+0

Xin chào Jona, Bạn có giải pháp nào về điều này không. Tôi cũng muốn triển khai hiệu ứng âm thanh vào ứng dụng nhưng có lỗi như trên. –

Trả lời

5

Bạn nên xem xét: this

Rõ ràng nó là một vấn đề chưa được giải quyết đã đưa ra trong ICS, và có lẽ đã không được giải quyết hoặc trong JB.

+0

Cảm ơn bạn đã liên kết nhưng tôi đã đăng lỗi đó: P – Jona

+0

@Android Joker: Tôi đã thấy liên kết. Tôi biết rằng vấn đề vẫn không giải quyết nhưng nếu tôi muốn thực hiện các AudioEffect như Bass, rắc rối và Equalizer? Vui lòng cung cấp bất kỳ bản demo nào hoạt động trên tất cả. –

3

Tôi có nên sử dụng AudioFx với id phiên âm thanh 0 không?

Nó có thể sẽ hoạt động trong một số trường hợp, nhưng không tính vào nó để tiếp tục làm như vậy trên các phiên bản Android trong tương lai. Bạn sẽ có khả năng tương tác giữa ứng dụng của bạn và các ứng dụng khác trên Jellybean.Chỉ cần có một cái nhìn vào những gì các AudioFlinger does when an effect is enabled:

// suspend all effects in AUDIO_SESSION_OUTPUT_MIX when enabling any effect on 
// another session. This gives the priority to well behaved effect control panels 
// and applications not using global effects. 
// Enabling post processing in AUDIO_SESSION_OUTPUT_STAGE session does not affect 
// global effects 
if ((sessionId != AUDIO_SESSION_OUTPUT_MIX) && (sessionId != AUDIO_SESSION_OUTPUT_STAGE)) { 
    setEffectSuspended_l(NULL, enabled, AUDIO_SESSION_OUTPUT_MIX); 
} 
+0

tôi đã thấy câu trả lời của bạn lần thứ hai về SO. Bạn có thể vui lòng trợ giúp với một số mô tả và mã java để giải quyết vấn đề này không? –

+0

Tôi chưa từng làm việc với bất kỳ thiết bị nào mà OP gặp sự cố, vì vậy tôi thực sự không thể giải quyết được bất kỳ giải pháp nào. Tôi đã thêm câu trả lời của mình chỉ để giải quyết rủi ro khi sử dụng phiên âm thanh 0, vì đó là một phần của câu hỏi. – Michael

0

tôi biết vấn đề này nếu ai đó muốn thử

làm điều này

Equalizer eq=null; 
. 
. 
. 
. 
. 
//in any function before initialization do this 
if(eq!=null) 
     eq.release(); 
eq=new Equalizer(0, audiosessionid); 

thử nó một lần

0

Khác với phiên 0 đó là "phiên toàn cầu không được chấp nhận", sự hiểu biết của tôi về mã AudioFlinger cho thấy rằng các phiên chỉ được tạo cho các lớp thực sự làm IO âm thanh, nghĩa là AudioRecord, AudioTrack, MediaPlayer, v.v. Bạn nên tạo các lớp này và sau đó lấy ID phiên, sau đó đính kèm hiệu ứng.

Bất kỳ giá trị nào khác mà bạn cung cấp cho ID phiên sẽ tương ứng với phiên âm thanh không tồn tại và do đó sẽ không thành công.

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