IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Android - získání AudioTrack ID z jiné classy do EQ

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Filip Barák
Člen
Avatar
Filip Barák:18.3.2019 22:48

Zdravím, mám jednoduchý signal generátor AudioTrack, který generuje jednoduchou vlnu (sinus, čtverec...) v samostatné classe. Kód vypadá asi nějak takto

private double tuneFreq; // = 440;

    private int sr = 44100;
    private int buffsize = AudioTrack.getMinBufferSize(sr,
            AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
    private AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
            sr, AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT, buffsize,
            AudioTrack.MODE_STREAM);


    @Override
    public void run() {
        super.run();
        isRunning = true;

        short samples[] = new short[buffsize];
        int amp = 32767;
        double twopi = 8. * Math.atan(1.);
        double ph = 0.0;

        audioTrack.play();

        while (isRunning) {

            double fr = tuneFreq;
            for (int i = 0; i < buffsize; i++) {
                samples[i] = (short) (amp * Math.sin(ph));
                if (samples[i] > (short) 0.0) {
                    samples[i] = (short) amp;
                }

                if (samples[i] < (short) 0.0) {
                    samples[i] = (short) -amp;
                }
                ph += twopi * fr / sr;
            }
            audioTrack.write(samples, 0, buffsize);

        }
        audioTrack.stop();
        audioTrack.release();

    }

V hlavní classe, ve které tento kód volám (generátor hraje po zmáčknutí tlačítka) mám zároveň Equalizér, který potřebuje při svém vzniku AudioSessionId, které jednoduše zavolám

audioTrack.getAudioSessionId.

Problém je, že je to ID s každým zapnutím generátoru jiné (s každým zmáčknutím tlačítka) a vygeneruje se až za

audioTrack.play();

ale EQ potřebuju mít zapnutý a nastavený už za onCreate v hlavní classe.
EQ volám

Generator g = new Generator();
mEqualizer = new Equalizer(0, g.getAudioID());
mEqualizer.setEnabled(true);

Zkusil jsem: v classe generátoru mám

public int getAudioID() {

       return audioTrack.getAudioSessionId();

který volám při vzniku EQ.
Bohužel, po zapnutí generátoru se ID změní a EQ tudíž nefunguje.
Zkoušel jsem volat ID a celý Equalizer až poté, co volám spuštění generátoru v hlavní classe (po zmáčknuté tlačítka, v OnTouchListeneru), i tak jsem dostával jiné ID z getAudioID a ze samotného generátoru.

Chci docílit: Jak dostat do Equalizeru vždy aktuální AudioTrack ID ?
Díky za každou radu.

Editováno 18.3.2019 22:49
 
Odpovědět
18.3.2019 22:48
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 1 zpráv z 1.