Javax.sound прямое управление аудиолинией - PullRequest
0 голосов
/ 10 июля 2020

Есть ли способ подать прямой ввод аудиолинии в java, чтобы я мог сделать синтезатор?

Я попытался передать двоичные данные в поток аудиовхода. Это не сработало

Когда это не сработало, я предполагаю, что я вводил неправильные данные, поэтому я получил волновой файл и после выяснения, где находятся аудиоданные, и подал их.

Но он все еще не работал

вот исходный код:

//audio.bin is just a .wav file
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.*;

import java.io.*;
import java.nio.file.Files;

public class main{
    public static Mixer mixer;
    public static Clip clip;
    public static AudioInputStream audioStream;
    public static InputStream inputStream;
    
    public static void main(String[] args) throws IOException{
        File file = new File("audio.bin");
        
        byte[] files = Files.readAllBytes(file.toPath());
        
        Mixer.Info[] mx = AudioSystem.getMixerInfo();
        //for(int i=0;i<mx.length;i++){
        //  System.out.println(i+"="+mx[i]);
        //}
        mixer = AudioSystem.getMixer(mx[0]);
        
        //Port.Info.SPEAKER;
        byte[] seq = new byte[files.length-0x56];
        int j=0x56;
        for(int i=0;i<seq.length;i++){
            seq[i]=files[j];
            j++;
            //System.out.println(seq[i]);
        }
        
        inputStream = new ByteArrayInputStream(files);
        
        AudioFormat format;
        DataLine.Info dataInfo = new DataLine.Info(Clip.class, null);
        try{
            clip = (Clip)mixer.getLine(dataInfo);
            format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,44100,16,2,4,44100,false);
            audioStream = new AudioInputStream(inputStream,format,files.length);
            clip.open(audioStream);
            clip.start();
        }catch(Exception e){
            System.err.println(e);
        }
        
    }
}


/*
        
        
        
        
        
        try{
            clip = (Clip)mixer.getLine(dataInfo);
            //AudioInputStream audioStream=;
            //clip.Open();
        }catch(Exception e){
            System.out.println(e);
        }
*/

1 Ответ

0 голосов
/ 11 июля 2020

Если вашей целью является прямое воспроизведение синтезированных аудиоданных, вы должны использовать для вывода класс SourceDataLine, а не Clip.

Например, для заранее определенного SourceDataLine с именем sdl и Byte [] с именем buffer размером 1024 (выбран произвольный размер):

while(isPlaying)
{
    buffer = getSomeAudioData();
    sdl.write(buffer, 0, 1024);
}

Аудиоданные, представленные в SourceDataLine, должны быть соответствовать AudioFormat, используемому при открытии SourceDataLine.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...