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

톤 제너레이터 좌우 소리 각각 출력하는 코드에 대한 질문입니다.

0 추천
주파수를 좌우로 각각 출력하는 코드를 작성하였습니다.

근데 이전까지 왼쪽 오른쪽 나뉘어서 잘 출력 되었는데

안드로이드 버전 11을 사용하는 태블릿으로 바꾼 다음 테스트를 하니까

양쪽에서 동시에 소리가 출력되는 현상이 발생합니다..

안드로이드 버전 8~9를 사용하는 태블릿은 여전히 좌 우 각각 출력 됩니다..

안드로이드 11은 양쪽 소리를 각각 출력을 못하게 되어 있나요?...

주파수를 각각 출력하는 코드는 대략 이렇습니다.

 

 

public void generate(int frequency, int duration, double toneVol){

        if(at != null ) {
            Log.d("audioTrack is " , "not null");
            at.stop();
            at.release();
            at = null;
        }

        double dnumSamples =  (double) sampleRate * duration ;
        dnumSamples = Math.ceil(dnumSamples);
        numSamples = (int) dnumSamples;
        double[] sampleTone  = new double[sampleRate * duration];
        for (int i = 0; i < numSamples; ++i) {
            sampleTone[i]  = Math.sin(2 * frequency * Math.PI * i / (sampleRate));
        }

        geneatedSound = new byte[numByte * numSamples * ch];

        int idx = 0;

        for (int i = 0; i < numSamples; i++) {
            double value = sampleTone[i];
            final short val = (short) (value * 32767 * toneVol);

            if(Sound) {   // Sound가 true면 왼쪽에서 출력
                geneatedSound[idx++] = (byte) (val & 0x00ff);    
                geneatedSound[idx++] = (byte) ((val & 0xff00) >>> 8);
                geneatedSound[idx++] = 0;
                geneatedSound[idx++] = 0;

            } else {   // Sound가 false면 오른쪽에서 출력
                geneatedSound[idx++] = 0;
                geneatedSound[idx++] = 0;
                geneatedSound[idx++] = (byte) (val & 0x00ff);
                geneatedSound[idx++] = (byte) ((val & 0xff00) >>> 8);
            }
        }

        try {

            int bufferSize = AudioTrack.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_OUT_STEREO,
                    AudioFormat.ENCODING_PCM_16BIT);

            bufferSize *= 2;

            at = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_STEREO,
                    AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.MODE_STREAM);

            at.setNotificationMarkerPosition(numSamples);
            at.setPlaybackPositionUpdateListener(
                    new AudioTrack.OnPlaybackPositionUpdateListener() {
                        @Override public void onPeriodicNotification(AudioTrack track) {
                        }

                        @Override public void onMarkerReached(AudioTrack track) {
                        }
                    });

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    void play() {
        Thread t1 = new Thread() {
            @Override
            public void run() {
                at.play();
                at.write(geneatedSound, 0, geneatedSound.length);
            }
        };
        t1.start();
    }
안드로이드222 (180 포인트) 님이 2022년 8월 29일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...