마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 사운드풀 소리 재생안나는 문제질문드립니다.

0 추천
10-22 17:54:42.795: V/SoundPool(22400): close(292)
10-22 17:54:42.795: V/SoundPool(22400): pointer = 0x7d6c5000, size = 32768, sampleRate = 44100, numChannels = 2
10-22 17:54:42.795: V/SoundPool-JNI(22400): callback: (1, 1, 0, 0x6faee278, 0x1d20062a)
10-22 17:54:42.795: V/SoundPool-JNI(22400): android_media_SoundPool_SoundPoolImpl_play
10-22 17:54:42.795: V/SoundPool(22400): play sampleID=1, leftVolume=5.000000, rightVolume=5.000000, priority=0, loop=0, rate=1.000000
10-22 17:54:42.795: V/SoundPool(22400): mState = 0 mChannelID=0, mNumChannels=1, mPos = 0, mPriority=-1, mLoop=0
10-22 17:54:42.795: V/SoundPool(22400): Allocated active channel
10-22 17:54:42.795: V/SoundPool(22400): play channel 0x6faee2f0 state = 0
10-22 17:54:42.795: V/SoundPool(22400): SoundChannel::play 0x6faee2f0: sampleID=1, channelID=1, leftVolume=5.000000, rightVolume=5.000000, priority=0, loop=0, rate=1.000000
10-22 17:54:42.796: V/AudioTrack(22400): sharedBuffer: 0x7d6c5000, size: 32768
10-22 17:54:42.796: V/AudioTrack(22400): set() streamType 3 frameCount 0 flags 0004
10-22 17:54:42.796: D/AudioTrack(22400): audiotrack 0x73612d08 set Type 3, rate 44100, fmt 1, chn 3, fcnt 0, flags 0004
10-22 17:54:42.797: V/AudioTrack(22400): createTrack_l() output 2 afLatency 92
10-22 17:54:42.797: D/AudioTrack(22400): pid [22400] sched_setscheduler to default: 1
10-22 17:54:42.798: E/AudioTrack(22400): AudioFlinger could not create track, status: -12
10-22 17:54:42.799: E/SoundPool(22400): Error creating AudioTrack
10-22 17:54:42.799: V/SoundPool(22400): delete oldTrack 0x0
10-22 17:54:42.799: D/AudioTrack(22400): ~audioTrack 0x73612d08
10-22 17:54:42.799: D/AudioTrackCenter(22400): removeTrack, trackPtr:0x73612d08

 

 

 

버튼을 누르면 소리가나는건데 처음에는 잘나다가 어느순간부터 소리가안나게됩니다 위와같은 에러를 뱉으면서요 그래서 status -12 에러가 메모리 누수로 나는거라고 들어서 soundpool release 로 메모리를 비워주고 다시해봐소 잠깐 다시들리고 그래서 거기서 좀더 응용을해봐서

 

    ++count_music;
                    System.out.println("반복 재생횟수 :"+count_music);
                    if(count_music>13){
                        sndpl12.release(); // 메모리 비우기
                        sndpl12.stop(sndID12);
                        sndID12 = 0;
                        System.out.println("반복 재생횟수 초기화");
                        Log.e("여기로 넘어오나", "ㅇㅇ..");
                        count_music = 0; //반복재생횟수 초기화

 

음성이 13번이상 출력되면 release 를시켜서 테스트를해보았는데 잠깐잘되는거같더니 근본적인 문제가 해결이안되고있습니다 혹시 해당 에러를 해결하신 선배님들 조언 부탁드립니다.
sadeva (21,550 포인트) 님이 2015년 10월 22일 질문

2개의 답변

0 추천
저도 이런 경험이 있는데요

혹시 loadcompleteListener를 쓰시는가요?

소스를 올려주시면 제가 도움드릴수도 있을것 같습니다
prague (26,200 포인트) 님이 2015년 10월 22일 답변
switch(audioManager.getRingerMode()) {
            case AudioManager.RINGER_MODE_VIBRATE:
                Vibrator v = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
               
                v.vibrate(100);
                break;
               
            case AudioManager.RINGER_MODE_NORMAL:
               
         
                try {
                   
                       if(Integer.parseInt(val) == 1) {
                       
                        sndpl12= new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
                            sndID12 = sndpl12.load(getApplicationContext(), R.raw.num1, 1);
                            sndpl12.setOnLoadCompleteListener(new OnLoadCompleteListener() {
                                @Override
                                public void onLoadComplete(SoundPool soundPool, int sampleId,
                                    int status) {
                                    sndpl12.play(sndID12, 5, 5, 0, 0, 1); //(파일, 왼쪽볼륨, 오른쪽 볼륨, 반복, 재생 속도)
                                }
                           
                            });
                       
                    } else if(Integer.parseInt(val) == 2) {
                       
                        sndpl12 = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
                        sndID12 = sndpl12.load(getApplicationContext(), R.raw.num2, 1);
                        sndpl12.setOnLoadCompleteListener(new OnLoadCompleteListener() {
                            @Override
                            public void onLoadComplete(SoundPool soundPool, int sampleId,
                                int status) {
                                sndpl12.play(sndID12, 5, 5, 0, 0, 1); //(파일, 왼쪽볼륨, 오른쪽 볼륨, 반복, 재생 속도)
                            }
                       
                        });
                    } else if(Integer.parseInt(val) == 3) {
                        sndpl12 = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
                        sndID12 = sndpl12.load(getApplicationContext(), R.raw.num3, 1);
                        sndpl12.setOnLoadCompleteListener(new OnLoadCompleteListener() {
                            @Override
                            public void onLoadComplete(SoundPool soundPool, int sampleId,
                                int status) {
                                sndpl12.play(sndID12, 5, 5, 0, 0, 1); //(파일, 왼쪽볼륨, 오른쪽 볼륨, 반복, 재생 속도)
                            }
                       
                        });
                    } else if(Integer.parseInt(val) == 4) {
                        sndpl12 = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
                        sndID12 = sndpl12.load(getApplicationContext(), R.raw.num4, 1);
                        sndpl12.setOnLoadCompleteListener(new OnLoadCompleteListener() {
                            @Override
                            public void onLoadComplete(SoundPool soundPool, int sampleId,
                                int status) {
                                sndpl12.play(sndID12, 5, 5, 0, 0, 1); //(파일, 왼쪽볼륨, 오른쪽 볼륨, 반복, 재생 속도)
                            }
                       
                        });
                    } else if(Integer.parseInt(val) == 5) {
                        sndpl12 = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
                        sndID12 = sndpl12.load(getApplicationContext(), R.raw.num5, 1);
                        sndpl12.setOnLoadCompleteListener(new OnLoadCompleteListener() {
                            @Override
                            public void onLoadComplete(SoundPool soundPool, int sampleId,
                                int status) {
                                sndpl12.play(sndID12, 5, 5, 0, 0, 1); //(파일, 왼쪽볼륨, 오른쪽 볼륨, 반복, 재생 속도)
                            }
                       
                        });
                    } else if(Integer.parseInt(val) == 6) {
                        sndpl12 = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
                        sndID12 = sndpl12.load(getApplicationContext(), R.raw.num6, 1);
                        sndpl12.setOnLoadCompleteListener(new OnLoadCompleteListener() {
                            @Override
                            public void onLoadComplete(SoundPool soundPool, int sampleId,
                                int status) {
                                sndpl12.play(sndID12, 5, 5, 0, 0, 1); //(파일, 왼쪽볼륨, 오른쪽 볼륨, 반복, 재생 속도)
                            }
                       
                        });
                    } else if(Integer.parseInt(val) == 7) {
                        sndpl12 = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
                        sndID12 = sndpl12.load(getApplicationContext(), R.raw.num7, 1);
                        sndpl12.setOnLoadCompleteListener(new OnLoadCompleteListener() {
                            @Override
                            public void onLoadComplete(SoundPool soundPool, int sampleId,
                                int status) {
                                sndpl12.play(sndID12, 5, 5, 0, 0, 1); //(파일, 왼쪽볼륨, 오른쪽 볼륨, 반복, 재생 속도)
                            }
                       
                        });
                    } else if(Integer.parseInt(val) == 8) {
                        sndpl12 = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
                        sndID12 = sndpl12.load(getApplicationContext(), R.raw.num8, 1);
                        sndpl12.setOnLoadCompleteListener(new OnLoadCompleteListener() {
                            @Override
                            public void onLoadComplete(SoundPool soundPool, int sampleId,
                                int status) {
                                sndpl12.play(sndID12, 5, 5, 0, 0, 1); //(파일, 왼쪽볼륨, 오른쪽 볼륨, 반복, 재생 속도)
                            }
                       
                        });
                    } else if(Integer.parseInt(val) == 9) {
                        sndpl12 = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
                        sndID12 = sndpl12.load(getApplicationContext(), R.raw.num9, 1);
                        sndpl12.setOnLoadCompleteListener(new OnLoadCompleteListener() {
                            @Override
                            public void onLoadComplete(SoundPool soundPool, int sampleId,
                                int status) {
                                sndpl12.play(sndID12, 5, 5, 0, 0, 1); //(파일, 왼쪽볼륨, 오른쪽 볼륨, 반복, 재생 속도)
                            }
                       
                        });
                    } else if(Integer.parseInt(val) == 0) {
                        sndpl12 = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
                        sndID12 = sndpl12.load(getApplicationContext(), R.raw.num0, 1);
                        sndpl12.setOnLoadCompleteListener(new OnLoadCompleteListener() {
                            @Override
                            public void onLoadComplete(SoundPool soundPool, int sampleId,
                                int status) {
                                sndpl12.play(sndID12, 5, 5, 0, 0, 1); //(파일, 왼쪽볼륨, 오른쪽 볼륨, 반복, 재생 속도)
                            }
                       
                        });
                    }else if(Integer.parseInt(val) == 101){
                        sndpl12 = new SoundPool(1, audioManager.STREAM_MUSIC, 0);
                        sndID12 = sndpl12.load(getApplicationContext(), R.raw.ding_dong,1);
                        sndpl12.setOnLoadCompleteListener(new OnLoadCompleteListener()
                        {
                            @Override
                            public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                                // TODO Auto-generated method stub
                            sndpl12.play(sndID12, 5, 5, 0, 0, 1);                           
                            }
                        });
                    }
                   
                } catch (NullPointerException e) {
                    Log.e("널포인트", e.getMessage());
                }catch (Exception e){
                    Log.e("예외처리", e.getMessage());
                }finally{
                   
                    ++count_music;
                    System.out.println("반복 재생횟수 :"+count_music);
                    if(count_music>13){
                        sndpl12.release(); // 메모리 비우기
                        sndpl12.stop(sndID12);
                        sndID12 = 0;
                        System.out.println("반복 재생횟수 초기화");
                        Log.e("여기로 넘어오나", "ㅇㅇ..");
                        count_music = 0; //반복재생횟수 초기화
                    }
                }
                break;
               
            case AudioManager.RINGER_MODE_SILENT:
               
                break;
            }
        }
       

setOnLoadCompleteListener 리스너를 사용하였고 소스는 이러합니다
0 추천
-12  의 경우  errno.h 파일에 선언 된 값 중

 ENOMEM 로 사운드 풀 객체 할당에 실패 했을 때 나오는 에러 코드로 보입니다.

오디오 인스턴스를 할당하는데 단말마다 다른 제한이 있을 수 있으니.

 사용이 끝난건 가급적  해제 해주시는게 좋을 듯 합니다.
익명사용자 님이 2015년 10월 22일 답변
2015년 10월 22일 수정
해제한다는게 release를 말씀하시는건가요?
네.....(12자 제한)
...