VLCJ均衡器工作不正确

时间:2016-06-06 07:28:34

标签: vlcj equalizer

我在Ubuntu 14.10下使用VLCJ 3.0.1,Plattform 3.5.2和JNA 3.5.2。

我想用均衡器创建一个简单的Vlcj Mediaplayer。

问题是,我可以播放* .mp3,但是当我启用均衡器并改变任何频段的增益时,我可以听到乐队的增益达到最大值。我无法改变它以降低增益。滑块没有效果。只有当我将增益更改为最大或最小时,才会关闭效果。

以下是仅用于测试的代码:

FesterTest.java

public static void main(String[] args) {

     Canvas m_surface;
     EmbeddedMediaPlayer m_mediaPlayer;
     Equalizer m_equalizer;

    Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);
    m_surface = new Canvas();
    m_surface.setBackground(Color.black);
    m_surface.setBounds(0, 0, 1024, 600);

    MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory();

    m_mediaPlayer = mediaPlayerFactory.newEmbeddedMediaPlayer();
    m_mediaPlayer.setVideoSurface(mediaPlayerFactory.newVideoSurface(m_surface));

    System.out.println(mediaPlayerFactory.isEqualizerAvailable());
    m_equalizer = mediaPlayerFactory.newEqualizer();

    System.out.println(LibVlcConst.MAX_GAIN);
    System.out.println(LibVlcConst.MIN_GAIN);
    System.out.println(LibVlcConst.MIN_VOLUME);
    System.out.println(LibVlcConst.MAX_VOLUME);

    JFrame f = new JFrame();
    JPanel p = new JPanel();
    f.add(p);
    p.add(m_surface);
    f.setVisible(true);
    m_mediaPlayer.playMedia("/home/patrick/Dev/content/068-becky_g_-_shower.mp3");

    EqualizerFrame frame = new EqualizerFrame(mediaPlayerFactory.getEqualizerBandFrequencies(), mediaPlayerFactory.getEqualizerPresetNames(), mediaPlayerFactory, m_mediaPlayer, m_equalizer);
    frame.pack();
    frame.setVisible(true);
}

和EqualizerFrame:

public class EqualizerFrame extends JFrame implements ChangeListener, ActionListener, ItemListener {

private static final String BAND_INDEX_PROPERTY = "equalizerBandIndex";

private final String dbFormat = "%.2fdB";

private final MediaPlayerFactory mediaPlayerFactory;
private final MediaPlayer mediaPlayer;
private final Equalizer equalizer;

private final SliderControl preampControl;
private final SliderControl[] bandControls;

private final JToggleButton enableButton;
private final JComboBox presetComboBox;


@SuppressWarnings({ "unchecked", "rawtypes" })
public EqualizerFrame(List<Float> list, List<String> presets, MediaPlayerFactory mediaPlayerFactory, MediaPlayer mediaPlayer, Equalizer equalizer) {
    super("Equalizer");

    this.mediaPlayerFactory = mediaPlayerFactory;
    this.mediaPlayer = mediaPlayer;
    this.equalizer = equalizer;

    setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

    JPanel contentPane = new JPanel();
    contentPane.setBorder(BorderFactory.createEmptyBorder(4,  4,  4,  4));
    contentPane.setLayout(new BorderLayout(0, 4));

    JPanel bandsPane = new JPanel();
    bandsPane.setLayout(new GridLayout(1, 1 + list.size(), 2, 0));

    preampControl = new SliderControl("Preamp", (int)LibVlcConst.MIN_GAIN, (int)LibVlcConst.MAX_GAIN, 0, dbFormat);
    preampControl.getSlider().addChangeListener(this);
    bandsPane.add(preampControl);

    bandControls = new SliderControl[list.size()];
    for(int i = 0; i < list.size(); i++) {
        bandControls[i] = new SliderControl(formatFrequency(list.get(i)), (int)LibVlcConst.MIN_GAIN, (int)LibVlcConst.MAX_GAIN, 0, dbFormat);
        bandControls[i].getSlider().putClientProperty(BAND_INDEX_PROPERTY, i);
        bandControls[i].getSlider().addChangeListener(this);
        bandsPane.add(bandControls[i]);
    }

    contentPane.add(bandsPane, BorderLayout.CENTER);

    JPanel controlsPane = new JPanel();
    controlsPane.setLayout(new BoxLayout(controlsPane, BoxLayout.X_AXIS));

    enableButton = new JToggleButton("Enable");
    enableButton.setMnemonic('e');
    controlsPane.add(enableButton);

    controlsPane.add(Box.createHorizontalGlue());

    JLabel presetLabel = new JLabel("Preset:");
    presetLabel.setDisplayedMnemonic('p');
    controlsPane.add(presetLabel);

    presetComboBox = new JComboBox();
    presetLabel.setLabelFor(presetComboBox);
    DefaultComboBoxModel presetModel = (DefaultComboBoxModel)presetComboBox.getModel();
    presetModel.addElement(null);
    for(String presetName : presets) {
        presetModel.addElement(presetName);
    }
    presetComboBox.setRenderer(new DefaultListCellRenderer() {
        @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            JLabel label = (JLabel)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            if(value != null) {
                label.setText(String.valueOf(value));
            }
            else {
                label.setText("--Select--");
            }
            return label;
        }
    });
    controlsPane.add(presetComboBox);

    contentPane.add(controlsPane, BorderLayout.SOUTH);

    setContentPane(contentPane);

    enableButton.addActionListener(this);
    presetComboBox.addItemListener(this);
}

private String formatFrequency(float hz) {
    if(hz < 1000.0f) {
        return String.format("%.0f Hz", hz);
    }
    else {
        return String.format("%.0f kHz", hz / 1000f);
    }
}

@Override
public final void actionPerformed(ActionEvent e) {
    boolean enable = enableButton.isSelected();
    if(!enable) {
        presetComboBox.setSelectedItem(null);
    }
    mediaPlayer.setEqualizer(enable ? equalizer : null);
}

@Override
public void stateChanged(ChangeEvent e) {
    if(e.getSource() instanceof JSlider) {
        JSlider slider = (JSlider)e.getSource();

        Integer index = (Integer)slider.getClientProperty(BAND_INDEX_PROPERTY);
        int value = slider.getValue();
        // Band...
        if(index != null) {
            equalizer.setAmp(index, (value / 100f));
        }
        // Preamp...
        else {
            equalizer.setPreamp(value / 100f);
        }

        if(!applyingPreset) {
            presetComboBox.setSelectedItem(null);
        }
    }
}

boolean applyingPreset;

@Override
public final void itemStateChanged(ItemEvent e) {
    String presetName = (String)presetComboBox.getSelectedItem();
    if(e.getStateChange() == ItemEvent.SELECTED) {
        if(presetName != null) {
            Equalizer presetEqualizer = mediaPlayerFactory.newEqualizer(presetName);
            if(presetEqualizer != null) {
                applyingPreset = true;
                preampControl.getSlider().setValue((int)(presetEqualizer.getPreamp() * 100f)); // FIXME
                float[] amps = presetEqualizer.getAmps();
                for(int i = 0; i < amps.length; i++) {
                    bandControls[i].getSlider().setValue((int)(amps[i] * 100f));
                }

                applyingPreset = false;
            }
        }
    }
}

}

我不知道我能做什么希望有人可以帮助我!!!!

由于 帕特里克

0 个答案:

没有答案