/* * File : QT61AudioBuffer.java * Created : 19-sep-2003 11:01 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2005 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import java.io.File; /** * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class QT61AudioBuffer extends AudioBuffer{ protected File file; protected quicktime.std.sg.SequenceGrabber mGrabber; protected quicktime.std.sg.SGSoundChannel mAudio; protected quicktime.app.view.MoviePlayer player; protected Thread recordThread; protected boolean initialized; /** Creates new QTAudioBuffer */ public QT61AudioBuffer(int seconds) throws Exception{ super(seconds); initialized=false; } public void play() throws Exception { stop(); if(initialized){ if(player==null && file!=null){ player=QT61Tools.getPlayer(file); } if(player!=null){ player.setTime(0); quicktime.app.time.TaskAllMovies.addMovieAndStart(); player.getMovie().setActive(true); player.setRate(1.0F); } } } protected void clear() { stop(); if(file!=null){ try{ file.delete(); } catch(Exception ex){ System.err.println("ERROR: Unable to delete file "+file.getPath()+"\n"+ex); } file=null; } } public void stop() { try{ if(player!=null){ player.setRate(0); player.getMovie().setActive(false); quicktime.app.time.TaskAllMovies.removeMovie(); } for(int i=0; i<10; i++){ if(mGrabber!=null && mGrabber.isRecordMode()){ mGrabber.stop(); Thread.sleep(50); } else break; } } catch(Exception ex){ System.err.println("QuickTime recording error at STOP:\n"+ex); } } protected void record() throws Exception { stop(); if(player!=null){ try{ player.getMovie().disposeQTObject(); } catch(Exception ex){ System.err.println("QuickTime error: unable to release player\n"+ex); } player=null; initialized=false; } if(file!=null){ file.delete(); file=null; } file=File.createTempFile("rec", ".tmp"); file.deleteOnExit(); mGrabber=new quicktime.std.sg.SequenceGrabber(); mAudio=new quicktime.std.sg.SGSoundChannel(mGrabber); mAudio.setUsage(quicktime.std.StdQTConstants.seqGrabRecord); mAudio.setSoundInputRate(22050); mAudio.setSoundInputParameters(16, 1, 0); //mAudio.settingsDialog(); mGrabber.setDataOutput(new quicktime.io.QTFile(file), quicktime.std.StdQTConstants.seqGrabToDisk); mGrabber.setMaximumRecordTime(m_seconds*60); mGrabber.prepare(false, true); activeAudioBuffer=this; recordThread=new Thread("JClic sound record"){ @Override public void run(){ try{ while(mGrabber.isRecordMode() && mGrabber.idleMore()){ mGrabber.idle(); Thread.sleep(20); } if(mGrabber.isRecordMode()) mGrabber.stop(); recordThread=null; if(mAudio!=null){ mGrabber.disposeChannel(mAudio); mAudio=null; } mGrabber.release(); mGrabber=null; initialized=true; activeAudioBuffer=null; hideRecordingCursor(); } catch(Exception ex){ System.err.println(ex.getMessage()); } } }; mGrabber.startRecord(); recordThread.start(); } }