Zmienna publiczna/globalna .. rzutownie w górę?

0

Mam program który ma wyświetlać 2 pliki wav (rysować ich wykresy), moja klasa główna to Menu w której tak naprawdę odpala się tylko jFrame z menu.
W klasie AudioInfo plik wav jest zczytywany, wygląda ona tak

import javax.sound.sampled.AudioInputStream;

public class AudioInfo {


    private static final int NUM_BITS_PER_BYTE = 8;
   

    private AudioInputStream audioInputStream;
    private int[][] samplesContainer;

    //cached values
    protected int sampleMax = 0;
    protected int sampleMin = 0;
    protected double biggestSample;

    public AudioInfo(AudioInputStream aiStream) {
        this.audioInputStream = aiStream;
        createSampleArrayCollection();
    }

    public int getNumberOfChannels(){
        int numBytesPerSample = audioInputStream.getFormat().getSampleSizeInBits() / NUM_BITS_PER_BYTE;
        return audioInputStream.getFormat().getFrameSize() / numBytesPerSample;
    }

    private void createSampleArrayCollection() {
        try {
            audioInputStream.mark(Integer.MAX_VALUE);
            audioInputStream.reset();
            byte[] bytes = new byte[(int) (audioInputStream.getFrameLength()) * ((int) audioInputStream.getFormat().getFrameSize())];
            int result = 0;
            try {
                result = audioInputStream.read(bytes);
            } catch (Exception e) {
                e.printStackTrace();
            }

            //convert sample bytes to channel separated 16 bit samples
            samplesContainer = getSampleArray(bytes);

            //find biggest sample. used for interpolating the yScaleFactor
            if (sampleMax > sampleMin) {
                biggestSample = sampleMax;
            } else {
                biggestSample = Math.abs(((double) sampleMin));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
   

    protected int[][] getSampleArray(byte[] eightBitByteArray) {
        int[][] toReturn = new int[getNumberOfChannels()][eightBitByteArray.length / (2 * getNumberOfChannels())];
        int index = 0;
        

        //loop through the byte[]
        for (int t = 0; t < eightBitByteArray.length;) {
            //for each iteration, loop through the channels
            for (int a = 0; a < getNumberOfChannels(); a++) {
                //do the byte to sample conversion
                //see AmplitudeEditor for more info
                int low = (int) eightBitByteArray[t];
                t++;
                int high = (int) eightBitByteArray[t];
                t++;
                int sample = (high << 8) + (low & 0x00ff);

                if (sample < sampleMin) {
                    sampleMin = sample;
                } else if (sample > sampleMax) {
                    sampleMax = sample;
                }
                //set the value.
               //System.out.println(sample);
                toReturn[a][index] = sample;
                
            }
             
            index++;

        }
               
        return toReturn;
    }

    public double getXScaleFactor(int panelWidth){
        return (panelWidth / ((double) samplesContainer[0].length));
    }

    public double getYScaleFactor(int panelHeight){
        return (panelHeight / (biggestSample * 2 * 1.2));
    }

    public int[] getAudio(int channel){
        return samplesContainer[channel];
    }

    protected int getIncrement(double xScale) {
        try {
            int increment = (int) (samplesContainer[0].length / (samplesContainer[0].length * xScale));
            return increment;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return -1;
    }

}

Jak zadeklarować w Menu jakąś tablica/kolekcje do której mógłbym wrzucać wartości z tablicy toReturn[0][index], potrzebuje takiej do obliczeń korelacji tych dwóch plików.

Czytałem coś o rzutowaniu w górę tylko jak to zrobić, mogę zadeklarować w Menu moją kolekcje, AudioInfo dać jako extends Menu, tylko jak zrobić żebym później w Menu miał już zwróconą kolekcje z danymi (a właściwie to 2 kolekcje jedną z AudioInfo i drugą z AudioInfo1 ) na której i mógłbym robić już co chce?

0

Do konstruktora klasy AudioInfo przekaż referencję do obiektu klasy Menu:

import javax.sound.sampled.AudioInputStream;

public class AudioInfo 
{
    ......
    private Menu menu;
    public AudioInfo(AudioInputStream aiStream,Menu menu) 
   {
        this.menu=menu;
        this.audioInputStream = aiStream;

w klasie Menu (zakładam, że tam konstruujesz obiekty klasy AudioInfo) napisz tak

     .... = new AudioInfo(someStream,this);

W zależności od dostępności kolekcji kol zdefiniowanej w klasie Menu, będziesz się mógł do niej odwołać tak

    menu.kol.add(cokolwiek);

lub

    menu.getKol().add(cokolwiek);
0

To mój cały folder z NB http://odsiebie.com/pokaz/5697617---d733.html (tak wiem że nie jest to najładniej zrobione)
Chciałbym zrobić tak że pod przyciskiem "Korelacja" wykonał się kod(już go mam) który obliczy korelacje, potrzebne są mi do tego wartości z tablicy toReturn[0]index linia 296 (w niej będą dane pierwszego pliku) którą utworzy mi klasa AudioInfo (a dokładnie metoda getSampleArray) i z drugiej tablicy toReturn1[0][index] linia 510 (utworzy ją klasa AudioInfo1). Szczerze mówiąc jest mi to obojętne czy dane dostane bezpośrednio z tych tablic czy wcześniej właduję sobie do kolekcji i będę mógł na nich swobodnie operować.

Bogdans jakbyś mógł bardziej łopatologicznie ;-) wyjaśnić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1