Нет управления звуком JAVA, когда я использую Linux?

Я использую звуковой API JAVA и пытаюсь получить некоторые элементы управления (по крайней мере, громкость) для микшеров и линий, но, похоже, нет никакого контроля. Вот часть кода, который я использую:

        for (Mixer.Info mixerInfo : AudioSystem.getMixerInfo()) {
        //System.out.println("MixerInfo : "+mixerInfo.getName());
        if (mixerInfo.getName().compareTo("PulseAudio Mixer")==0) {
            System.out.println("Java Sound Audio Engine : "+AudioSystem.getMixer(mixerInfo));
            mixer=AudioSystem.getMixer(mixerInfo);
            System.out.println("\t Controls supported by Mixer:");
            for(Control c : mixer.getControls()) {
                System.out.println("\t =>" + c);
            }
            System.out.println("\t TargetLine availabe for this mixer : ");
            for (Line.Info i : mixer.getTargetLineInfo()) {
                System.out.println("\t => "+i);
                System.out.println("\t\t Controls supported by Target Line :");
                try {
                    for (Control c : AudioSystem.getLine(i).getControls()) {
                        System.out.println("\t\t =>"+c);
                    }
                } catch (LineUnavailableException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            System.out.println("--------------------------");
            //break;
        } else {
            //System.out.println("Other Mixer : "+AudioSystem.getMixer(mixerInfo));
            System.out.println("Other Sound Audio Engine : "+AudioSystem.getMixer(mixerInfo));
            mixer2=AudioSystem.getMixer(mixerInfo);
            System.out.println("\t Controls supported by Mixer:");
            for(Control c : mixer2.getControls()) {
                System.out.println("\t =>" + c);
            }
            System.out.println("\t TargetLine availabe for this mixer :");
            for (Line.Info i : mixer2.getSourceLineInfo()) {
                System.out.println("\t => "+i);
                System.out.println("\t\t Controls supported by Target Line :");
                try {
                    for (Control c : AudioSystem.getLine(i).getControls()) {
                        System.out.println("\t\t =>"+c);
                    }
                } catch (LineUnavailableException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            System.out.println("--------------------------");

        }
    }

И вот результат, полученный в консоли:

Java Sound Audio Engine: org.classpath.icedtea.pulseaudio.PulseAudioMixer@1404d1 Элементы управления, поддерживаемые микшером:

TargetLine доступна для этого микшера:

=> интерфейс TargetDataLine, поддерживающий 42 аудиоформата и буферы от 0 до 1000000 байт

Элементы управления, поддерживаемые Target Line:


Другой звуковой движок: com.sun.media.sound.DirectAudioDevice@13b8dae

Элементы управления, поддерживаемые микшером:

TargetLine доступна для этого микшера:

=> интерфейс SourceDataLine с поддержкой 512 аудиоформатов и буферами не менее 32 байт

Элементы управления, поддерживаемые Target Line:

=> Интерфейсный клип, поддерживающий 512 аудиоформатов и буферы размером не менее 32 байт.

Элементы управления, поддерживаемые Target Line:


Другое звуковое ядро: com.sun.media.sound.DirectAudioDevice@1cad7c3 Элементы управления, поддерживаемые микшером:

TargetLine доступна для этого микшера:

=> интерфейс SourceDataLine с поддержкой 24 аудиоформатов и буферами не менее 32 байт

Элементы управления, поддерживаемые Target Line:

=> Интерфейсный клип, поддерживающий 24 аудиоформата и буфер размером не менее 32 байт.

Элементы управления, поддерживаемые Target Line:


Другой звуковой движок: com.sun.media.sound.DirectAudioDevice@1a9cf86

Элементы управления, поддерживаемые микшером:

TargetLine доступна для этого микшера:

=> интерфейс SourceDataLine с поддержкой 24 аудиоформатов и буферами не менее 32 байт

Элементы управления, поддерживаемые Target Line:

=> Интерфейсный клип, поддерживающий 24 аудиоформата и буфер размером не менее 32 байт.

Элементы управления, поддерживаемые Target Line:


Другое звуковое ядро: com.sun.media.sound.PortMixer@17fd320 Элементы управления, поддерживаемые микшером:

TargetLine доступна для этого микшера:

=> Порт источника Mic Boost

Элементы управления, поддерживаемые Target Line:

=> Захват исходного порта

Элементы управления, поддерживаемые Target Line:

=> Порт цифрового источника


В чем может быть проблема?

Примечание. Я работаю не в ОС Windows, а в ОС Xubuntu (linux). Вот почему у меня не Java Sound Audio Engine, а PulseAudioMixer.


person Dr_Click    schedule 17.03.2015    source источник
comment
Вот часть кода, который я использую Чтобы быстрее получить помощь, опубликуйте MCVE (минимальный Полный поддающийся проверке пример) или SSCCE (краткий, автономный, правильный пример). В чем может быть проблема? Поддержка Java Sound может быть неполной. Обычно это нормально в Windows, часто не работает в OS X и часто только частично реализовано в * nix.   -  person Andrew Thompson    schedule 18.03.2015
comment
Ну, так что, я попробую сам переписать нужные мне функции? Этими функциями являются усиление, громкость, отключение звука, настройки баса/среднего/трехзвучного звука... Или, может быть, кодировать их будет адом?   -  person Dr_Click    schedule 18.03.2015


Ответы (2)


То, что Эндрю сказал в комментарии о поддержке пятнистости различных строк, я также нашел правдой. Кроме того, регулятор громкости, если он присутствует, часто далек от идеала. Он может изменять громкость только при каждой загрузке буфера аудиоданными, поэтому быстрые изменения, как правило, вызывают большие скачки уровня между буферами, что, в свою очередь, вызывает щелчки или эффект застегивания.

Я рекомендую писать свои собственные элементы управления. Есть хороший пример, который вы можете использовать в качестве начальной структуры в Учебниках по Java, раздел под названием Использование конвертеров файлов и форматов. Ниже приведен пример кода под заголовком «Чтение звуковых файлов». Обратите внимание на комментарий:

// Here, do something useful with the audio data that's 
// now in the audioBytes array... 

В этот момент вы должны преобразовать байты в данные PCM, затем умножить значения на коэффициент громкости (обычно с плавающей запятой в диапазоне от 0 до 1), а затем преобразовать обратно в байты для воспроизведения. Написав свой, можно сделать буфер поменьше, или придумать другие схемы, чтобы разнести изменение громкости так, чтобы оно не было слишком резким. Кроме того, можно сделать функцию, чтобы изменение от 0 до 1 более точно отображало воспринимаемую громкость. Для всех этих шагов вы можете обратиться к предыдущим сообщениям на StackOverflow.

Я только что вспомнил последнюю часть раздела «Учебники по Java» об элементах управления. Там упоминается возможность написания собственного. К сожалению, они не предоставляют много примеров на тот момент.

person Phil Freihofner    schedule 18.03.2015

В JavaSound в Linux действительно нет элементов управления, даже в последней версии JDK при использовании PulseAudio.

person Stefan Reich    schedule 02.03.2017