/*
* @(#)MpegAudioControl.java 1.1 99/03/03
*
* Copyright 1996-1998 by Sun Microsystems, Inc.,
* 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
* All rights reserved.
*
* This software is the confidential and proprietary information
* of Sun Microsystems, Inc. ("Confidential Information"). You
* shall not disclose such Confidential Information and shall use
* it only in accordance with the terms of the license agreement
* you entered into with Sun.
*/
package com.ibm.media.codec.audio.mpegenc;
import javax.media.*;
import javax.media.control.*;
import java.awt.*;
import java.awt.event.*;
/**
* Implementation for mpeg audio encoder control
*/
public class MpegAudioControlAdapter implements MpegAudioControl,
BitRateControl, Owned {
Component component=null;
NativeEncoder owner=null;
int layer;
int bitrate;
int error_protection;
int nChannels;
int joint_stereo;
int original;
int copyright;
int layout;
int samplingFrequency;
int[] availableRates;
/**
* Indicates support for audio layer 1
*/
public final static int LAYER_1 = 1<<0;
/**
* Indicates support for audio layer 2
*/
public final static int LAYER_2 = 1<<1;
/**
* Indicates support for audio layer 3
*/
public final static int LAYER_3 = 1<<2;
/**
* Returns the audio layer support capability.<br>
* The returned value consists of a logical OR among the relevant flags.
* @see #LAYER_1
* @see #LAYER_2
* @see #LAYER_3
*/
public int getSupportedAudioLayers() {
return LAYER_1 | LAYER_2;
}
/**
* Indicates support for 16 KHz audio sampling rate
*/
public final static int SAMPLING_RATE_16 = 1<<0;
/**
* Indicates support for 22.05 KHz audio sampling rate
*/
public final static int SAMPLING_RATE_22_05 = 1<<1;
/**
* Indicates support for 24 KHz audio sampling rate
*/
public final static int SAMPLING_RATE_24 = 1<<2;
/**
* Indicates support for 32 KHz audio sampling rate
*/
public final static int SAMPLING_RATE_32 = 1<<3;
/**
* Indicates support for 44.1 KHz audio sampling rate
*/
public final static int SAMPLING_RATE_44_1 = 1<<4;
/**
* Indicates support for 48 KHz audio sampling rate
*/
public final static int SAMPLING_RATE_48 = 1<<5;
/**
* Returns the audio sampling rate support capability.<br>
* The returned value consists of a logical OR among the relevant flags.
* @see #SAMPLING_RATE_16
* @see #SAMPLING_RATE_22_05
* @see #SAMPLING_RATE_24
* @see #SAMPLING_RATE_32
* @see #SAMPLING_RATE_44_1
* @see #SAMPLING_RATE_48
*/
public int getSupportedSamplingRates() {
return SAMPLING_RATE_32 | SAMPLING_RATE_44_1 | SAMPLING_RATE_48;
}
/**
* Indicates support for single channel layout
*/
public final static int SINGLE_CHANNEL = 1<<0;
/**
* Indicates support for two channels stereo layout
*/
public final static int TWO_CHANNELS_STEREO = 1<<1;
/**
* Indicates support for two channels dual layout
*/
public final static int TWO_CHANNELS_DUAL = 1<<2;
/**
* Indicates support for three channels 2-1 layout
* (Left, Right and single Surround)
*/
public final static int THREE_CHANNELS_2_1 = 1<<2;
/**
* Indicates support for three channels 3-0 layout
* (Left, Center and Right)
*/
public final static int THREE_CHANNELS_3_0 = 1<<3;
/**
* Indicates support for four channels 2-0 2-0 layout
* (Left and Right of first program, Left and Right of second program)
*/
public final static int FOUR_CHANNELS_2_0_2_0 = 1<<4;
/**
* Indicates support for four channels 2-2 layout
* (Left, Right, Left Surround and Right Surround)
*/
public final static int FOUR_CHANNELS_2_2 = 1<<5;
/**
* Indicates support for four channels 3-1 layout
* (Left, Center, Right and single Surround)
*/
public final static int FOUR_CHANNELS_3_1 = 1<<6;
/**
* Indicates support for five channels 3-0 2-0 layout
* (Left, Center and Right of first program, Left and Right of
* second program)
*/
public final static int FIVE_CHANNELS_3_0_2_0 = 1<<7;
/**
* Indicates support for five channels 3-2 layout
* (Left, Center, Right, Left Surround and Right surround)
*/
public final static int FIVE_CHANNELS_3_2 = 1<<8;
/**
* Returns the audio channel layout support capability.<br>
* The returned value consists of a logical OR among the relevant flags.
* @see #SINGLE_CHANNEL
* @see #TWO_CHANNELS_STEREO
* @see #TWO_CHANNELS_DUAL
* @see #THREE_CHANNELS_2_1
* @see #THREE_CHANNELS_3_0
* @see #FOUR_CHANNELS_2_0_2_0
* @see #FOUR_CHANNELS_2_2
* @see #FIVE_CHANNELS_3_0_2_0
* @see #FIVE_CHANNELS_3_2
*/
public int getSupportedChannelLayouts() {
return SINGLE_CHANNEL | TWO_CHANNELS_STEREO;
}
/**
* Returns the low freuqency channel support capability.<br>
*/
public boolean isLowFrequencyChannelSupported() {
return false;
}
/**
* Returns the multilingual mode support capability.<br>
*/
public boolean isMultilingualModeSupported() {
return false;
}
/**
* Controls the MPEG Audio Layer.<br>
* Returns the layer which was actually set.
*/
public int setAudioLayer(int audioLayer) {
// layer=owner.setAudioLayer(audioLayer);
return layer;
}
/**
* Returns the current MPEG Audio Layer.<br>
*/
public int getAudioLayer() {
return layer;
}
/**
* Controls the MPEG Audio channel layout.<br>
* Returns the channel layout which was actually set.
*/
public int setChannelLayout(int channelLayout){
return layout;
}
/**
* Returns the current MPEG Audio channel layout.<br>
*/
public int getChannelLayout(){
return layout;
}
/**
* Controls the Low Frequency Channel mode.
* "true" is on; "false" is off. <br>
* Returns true if Low Frequency Channel mode is actually turned on.
*/
public boolean setLowFrequencyChannel(boolean on){
return false;
}
/**
* Returns true if Low Frequency Channel mode is turned on.
*/
public boolean getLowFrequencyChannel(){
return false;
}
/**
* Controls the Multilingual mode.
* "true" is on; "false" is off. <br>
* Returns true if Multilingual mode is actually turned on.
*/
public boolean setMultilingualMode(boolean on){
return false;
}
/**
* Returns true if Multilingual mode is turned on.
*/
public boolean getMultilingualMode() {
return false;
}
public java.lang.Object getOwner() {
return (Object)owner;
}
/**
* Returns the current bit rate of the owning object. If the stream
* is of variable bit rate, then the value returned is an
* instantaneous or average bit rate over a period of time.
*/
public int getBitRate() {
return bitrate;
}
/**
* Sets the bit rate of the owning object. This is mostly relevant
* in the case of encoders. If the bit rate cannot be controlled, then
* the return value is -1.
* @return the bit rate that was actually set on the object, or -1
* if the bit rate is not controllable.
*/
public int setBitRate(int bitrate) {
// bitrate=owner.setBitRate(bitrate);
return bitrate;
}
/**
* Returns the lowest bit rate that this object can encode the
* data stream to.
*/
public int getMinSupportedBitRate() {
return 32000;
}
/**
* Returns the highest bit rate that this object can encode the
* data stream to.
*/
public int getMaxSupportedBitRate() {
return 448000;
}
String SAMPLING_FREQUENCY_STRING = " Sampling Frequency ";
String ERROR_PROTECTION_STRING = " Error Protection ";
String ORIGINAL_STRING = " Original ";
String COPYRIGHT_STRING = " Copyright ";
String LAYER_STRING = " Layer ";
String LAYER_1_STRING = " Layer 1 ";
String LAYER_2_STRING = " Layer 2 ";
String MODE_STRING = " Mode ";
String MONO_STRING = " Mono ";
String STEREO_STRING = " Stereo ";
String JOINT_STEREO_STRING = " Joint Stereo ";
String BITRATE_STRING = " Bitrate ";
public java.awt.Component getControlComponent() {
if (component==null) {
Panel componentPanel=new Panel();
componentPanel.setLayout(new com.sun.media.controls.VFlowLayout(0));
Panel freqPanel=new Panel();
freqPanel.setLayout(new BorderLayout() );
freqPanel.add("West", new Label(SAMPLING_FREQUENCY_STRING,Label.CENTER) );
freqPanel.add("East", new Label(samplingFrequency+"",Label.CENTER) );
componentPanel.add(freqPanel);
Panel errPanel=new Panel();
errPanel.setLayout(new BorderLayout() );
errPanel.add("West",new Label(ERROR_PROTECTION_STRING ,Label.CENTER) );
Checkbox err_cb=new Checkbox(null,null,error_protection!=0);
err_cb.addItemListener( new ItemListener() {
public void itemStateChanged(ItemEvent e) {
int new_error_protection=e.getStateChange();
if (!owner.isStarted) {
error_protection=(new_error_protection==e.SELECTED) ? 1 : 0 ;
owner.setErrorProtect(error_protection);
} else {
Checkbox in_cb=(Checkbox)e.getItemSelectable();
in_cb.setState(error_protection!=0);
}
}
} );
errPanel.add("East",err_cb );
Panel orgPanel=new Panel();
orgPanel.setLayout(new BorderLayout() );
orgPanel.add("West",new Label(ORIGINAL_STRING,Label.CENTER) );
Checkbox org_cb=new Checkbox(null,null,original!=0);
org_cb.addItemListener( new ItemListener() {
public void itemStateChanged(ItemEvent e) {
int new_original=e.getStateChange();
if (!owner.isStarted) {
original=(new_original==e.SELECTED) ? 1 : 0 ;
owner.setOriginal(original);
} else {
Checkbox in_cb=(Checkbox)e.getItemSelectable();
in_cb.setState(original!=0);
}
}
} );
orgPanel.add("East",org_cb );
Panel cpyPanel=new Panel();
cpyPanel.setLayout(new BorderLayout() );
cpyPanel.add("West",new Label(COPYRIGHT_STRING,Label.CENTER) );
Checkbox cpy_cb=new Checkbox(null,null,copyright!=0);
cpy_cb.addItemListener( new ItemListener() {
public void itemStateChanged(ItemEvent e) {
int new_copyright=e.getStateChange();
if (!owner.isStarted) {
copyright=(new_copyright==e.SELECTED) ? 1 : 0 ;
owner.setOriginal(copyright);
} else {
Checkbox in_cb=(Checkbox)e.getItemSelectable();
in_cb.setState(copyright!=0);
}
}
} );
cpyPanel.add("East",cpy_cb );
Panel layerPanel=new Panel();
layerPanel.setLayout(new BorderLayout() );
layerPanel.add("West",new Label(LAYER_STRING,Label.CENTER) );
Choice layer_choice=new Choice();
layer_choice.add(LAYER_1_STRING);
layer_choice.add(LAYER_2_STRING);
layer_choice.select(LAYER_2_STRING);
layer_choice.addItemListener( new ItemListener() {
public void itemStateChanged(ItemEvent e) {
String s=(String)e.getItem();
if (!owner.isStarted) {
layer=s.equals(LAYER_1_STRING) ? 1 : 2;
setAvailableRates();
owner.setLayer(layer);
} else {
Choice in_choice=(Choice)e.getItemSelectable();
in_choice.select( (layer==1) ? LAYER_1_STRING : LAYER_2_STRING);
}
}
} );
layerPanel.add("East",layer_choice );
Panel cnlPanel=new Panel();
cnlPanel.setLayout(new BorderLayout() );
cnlPanel.add("West",new Label(MODE_STRING,Label.CENTER) );
Choice mode_choice=new Choice();
if (nChannels==1) {
mode_choice.add(MONO_STRING);
} else {
mode_choice.add(STEREO_STRING);
mode_choice.add(JOINT_STEREO_STRING);
mode_choice.select( (joint_stereo !=0 ) ?
JOINT_STEREO_STRING :
STEREO_STRING );
mode_choice.addItemListener( new ItemListener() {
public void itemStateChanged(ItemEvent e) {
String s=(String)e.getItem();
if (!owner.isStarted) {
joint_stereo= s.equals(STEREO_STRING) ? 0 : 1;
int mode=(joint_stereo==0) ?
NativeEncoder.MPEG_STEREO :
NativeEncoder.MPEG_JOINT_STEREO ;
owner.SetEncodingType(mode);
} else {
Choice in_choice=(Choice)e.getItemSelectable();
in_choice.select( (joint_stereo !=0 ) ?
JOINT_STEREO_STRING :
STEREO_STRING );
}
}
} );
}
cnlPanel.add("East", mode_choice );
Panel ratePanel=new Panel();
ratePanel.setLayout(new BorderLayout() );
ratePanel.add("West",new Label(BITRATE_STRING,Label.CENTER) );
ratesComp = new Choice();
setAvailableRates();
ratesComp.addItemListener( new ItemListener() {
public void itemStateChanged(ItemEvent e) {
String s=(String)e.getItem();
if (!owner.isStarted) {
bitrate=Integer.parseInt(s.substring(0,3).trim());
owner.setBitrate(bitrate);
} else {
Choice in_choice=(Choice)e.getItemSelectable();
in_choice.select( bitrate+" Kbits/sec " );
}
}
} );
ratePanel.add("East",ratesComp );
componentPanel.add(ratePanel);
componentPanel.add(layerPanel);
// componentPanel.add(freqPanel); //sbd:disabled
componentPanel.add(cnlPanel);
componentPanel.add(errPanel);
componentPanel.add(orgPanel);
componentPanel.add(cpyPanel);
component=componentPanel;
}
return (Component)component;
}
Choice ratesComp;
void setAvailableRates() {
if (layer==1) {
if (nChannels==1) {
availableRates=owner.layer1BitRate_mono;
} else {
availableRates=owner.layer1BitRate_stereo;
}
} else {
if (nChannels==1) {
availableRates=owner.layer2BitRate_mono;
} else {
availableRates=owner.layer2BitRate_stereo;
}
}
if (ratesComp!=null) {
bitrate=128*nChannels;
owner.setBitrate(bitrate);
ratesComp.removeAll();
for (int i=0;i<availableRates.length;i++) {
ratesComp.add(availableRates[i]+" Kbits/sec ");
}
ratesComp.select( bitrate+" Kbits/sec " );
}
}
public MpegAudioControlAdapter(NativeEncoder new_Owner, int new_Layer, int new_samplingFrequency,
int new_nChannels,int new_bitrate,int new_copyright,int new_original,int new_error_protect, int new_joint_stereo) {
owner=new_Owner;
layer=new_Layer;
samplingFrequency=new_samplingFrequency;
nChannels=new_nChannels;
bitrate=new_bitrate;
copyright=new_copyright;
original=new_original;
error_protection=new_error_protect;
joint_stereo=new_joint_stereo;
}
}
|