FileDocCategorySizeDatePackage
AudioCaptureToDisk.javaAPI DocExample8180Wed Nov 10 12:54:28 GMT 2004com.oreilly.qtjnotebook.ch06

AudioCaptureToDisk

public class AudioCaptureToDisk extends Frame implements ActionListener, ItemListener

Fields Summary
static final Dimension
meterDim
Choice
deviceChoice
Checkbox
previewCheck
AudioLevelMeter
audioLevelMeter
SequenceGrabber
grabber
SGSoundChannel
soundChannel
SPBDevice
inputDriver
boolean
grabbing
Button
stopButton
QTFile
grabFile
Constructors Summary
public AudioCaptureToDisk()


        
        super ("Audio Record");
        QTSessionCheck.check();
        setLayout (new GridLayout (4, 1));
        deviceChoice = new Choice();
        deviceChoice.addItemListener (this);
        add (deviceChoice);
        previewCheck = new Checkbox ("Preview", false);
        previewCheck.addItemListener (this);
        add (previewCheck);
        audioLevelMeter = new AudioLevelMeter();
        add (audioLevelMeter);
        stopButton = new Button ("Stop");
        stopButton.addActionListener (this);
        add (stopButton);
        setUpAudioGrab();
        grabbing = true;
    
Methods Summary
public voidactionPerformed(java.awt.event.ActionEvent e)

        if (e.getSource() == stopButton) {
            System.out.println ("Stop grabbing");
            try {
                if (grabber != null) {
                    grabber.stop();
                }
            } catch (QTException qte) {
                qte.printStackTrace();
            } finally {
                System.exit (0);
            }
        }
    
public voiditemStateChanged(java.awt.event.ItemEvent e)

        try {
            if (e.getSource() == previewCheck) {
                if (previewCheck.getState())
                    soundChannel.setVolume (1.0f);
                else
                    soundChannel.setVolume (0.0f);
            } else if (e.getSource() == deviceChoice) {
                System.out.println ("changed device to "+
                                    deviceChoice.getSelectedItem());
                grabbing = false;
                soundChannel.setDevice (deviceChoice.getSelectedItem());
                // also reset inputDriver?
                inputDriver = soundChannel.getInputDriver();
                inputDriver.setLevelMeterOnOff (true);

                grabbing = true;
            }
        } catch (QTException qte) {
            qte.printStackTrace();
        }
    
public static voidmain(java.lang.String[] args)

        try {
            Frame f = new AudioCaptureToDisk();
            f.pack();
            f.setVisible(true);
        } catch (QTException qte) {
            qte.printStackTrace();
        }
    
protected voidsetUpAudioGrab()

        grabber = new SequenceGrabber();
        System.out.println ("got grabber");
        soundChannel = new SGSoundChannel (grabber);
        System.out.println ("Got SGAudioChannel");
        System.out.println ("SGChannelInfo = " +
                            soundChannel.getSoundInputParameters());
        System.out.println ("SoundDescription = " + 
                            soundChannel.getSoundDescription());

        // create list of input devices
        // getDeviceList flags: http://developer.apple.com/documentation/QuickTime/APIREF/SOURCESIII/sggetchanneldevicelist.htm
        SGDeviceList devices = soundChannel.getDeviceList(StdQTConstants.sgDeviceListDontCheckAvailability);
        int deviceCount = devices.getCount();
        for (int i=0; i<deviceCount; i++) {
            SGDeviceName deviceName = devices.getDeviceName(i);
            // is it available?
            if ((deviceName.getFlags() &
                 StdQTConstants.sgDeviceNameFlagDeviceUnavailable) == 0)
            deviceChoice.add(deviceName.getName());
        }

        // prepare and start previewing
        // note - second prepare arg should seemingly be false,
        // but if it is, you get erroneous dskFulErr's
        grabber.prepare(true, false);
        soundChannel.setUsage (StdQTConstants.seqGrabPreview |
                               StdQTConstants.seqGrabRecord);
        soundChannel.setVolume (0.0f);

        // get settings
        // yikes! this crashes java 1.4.2 on mac os x!
        // soundChannel.settingsDialog();
        final SGSoundChannel sc = soundChannel;
        Thread t = new Thread() {
                public void run() {
                    try {
                        sc.settingsDialog();
                    } catch (QTException qte) {
                        qte.printStackTrace();
                    }
                }
            };
        t.start();
        while (t.isAlive())
            Thread.yield();

        grabber.startPreview();

        // create output file
        grabFile = new QTFile (new java.io.File ("audiograb.mov"));
        if (grabFile.exists())
            grabFile.delete();
        grabber.setDataOutput(grabFile,
                              StdQTConstants.seqGrabToDisk 
                              //seqGrabDontAddMovieResource);
                              );
        grabber.startRecord();

        inputDriver = soundChannel.getInputDriver();
        inputDriver.setLevelMeterOnOff (true);

        int[] levelTest = inputDriver.getActiveLevels();
        System.out.println (levelTest.length + " active levels");

        // set up thread to update level meter
        ActionListener timerCallback =
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    if (grabbing) {
                        try {
                            grabber.idle();
                            audioLevelMeter.repaint();
                        } catch (QTException qte) {
                            qte.printStackTrace();
                        }
                    }
                }
            };
        Timer timer = new Timer (50, timerCallback);
        timer.start();