001 /*
002 * Copyright (C) 2006-2010 Enrique Lara (k957@68k.org)
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 package net.sf.jmorse;
018
019 import net.sf.jmorse.util.logging.Logger;
020
021 import java.io.File;
022 import java.io.FileOutputStream;
023 import java.io.OutputStream;
024
025 import javax.sound.sampled.AudioFileFormat;
026 import javax.sound.sampled.AudioFormat;
027 import javax.sound.sampled.AudioInputStream;
028 import javax.sound.sampled.AudioSystem;
029
030 /**
031 * @author <a href="mailto:k957@68k.org">Enrique Lara</a>
032 */
033 public class MorseAudioFileWriter extends AudioMorseWriter {
034 private static final Logger s_log = Logger.getLogger(MorseAudioFileWriter.class);
035 private static final boolean DEBUG_ENABLED = s_log.isDebugEnabled();
036
037 public MorseAudioFileWriter(String fileBaseName) {
038 super();
039
040 setFileName(fileBaseName);
041 }
042
043 // --------------------------------------------------- Instance Variables
044 private AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;
045 int writeCount = 0;
046 protected String fileBaseName;
047
048 // --------------------------------------------------- Properties
049 public AudioFileFormat.Type getFileType() {
050 return this.fileType;
051 }
052
053 private String getFileName() {
054 String rval = this.fileBaseName;
055
056 if (writeCount > 0) {
057 rval = rval + "." + Integer.toString(writeCount);
058 }
059
060 return rval;
061 }
062
063 public void setFileType(AudioFileFormat.Type fileType) {
064 this.fileType = fileType;
065 }
066
067 public void setFileName(String fileBaseName) {
068 writeCount = 0;
069 this.fileBaseName = fileBaseName;
070 }
071
072 protected void writeMorse(char[] msg, int len) {
073 short v = (short) (12.7 * volume);
074
075 if (DEBUG_ENABLED) {
076 s_log.debug("tone=" + tone);
077 s_log.debug("volume=" + volume);
078 }
079
080 MorseBeep mb = new MorseBeep();
081 mb.setVolume(v);
082 mb.setTone((double) tone);
083 mb.setWpm((short) wpm);
084
085 if (saveFile(mb, msg, len)) {
086 if (DEBUG_ENABLED) {
087 s_log.debug("OK");
088 }
089 } else {
090 s_log.error("Problems writing morse to file.");
091 }
092 }
093
094 public boolean saveFile(MorseBeep mb, char[] msg, int len) {
095 boolean result = true;
096
097 String fileName = getFileName();
098
099 if (DEBUG_ENABLED) {
100 s_log.debug("save msg:" + new String(msg, 0, len) + ", to file:" + fileName);
101 }
102
103 byte[] audioData = mb.generateAudioData(msg, len);
104 result = (audioData != null);
105
106 if (result) {
107 try {
108 File file = new File(fileName);
109 OutputStream os = new FileOutputStream(file);
110
111 result = saveAudioData(audioData, os, fileType);
112
113 os.close();
114
115 writeCount++;
116 } catch (Exception e) {
117 s_log.error("Problems writing file:" + fileName, e);
118 }
119 }
120
121 return result;
122 }
123
124 private static boolean saveAudioData(byte[] audioData, OutputStream os, AudioFileFormat.Type fileType) {
125 boolean result = true;
126
127 try {
128 AudioFormat af = MorseUtil.getAudioFormat();
129 AudioInputStream is = MorseUtil.getAudioInputStream(audioData, af);
130
131 int nbytesWritten = AudioSystem.write(is, fileType, os);
132
133 if (DEBUG_ENABLED) {
134 s_log.debug("audioData nbytes=" + audioData.length);
135 s_log.debug("nbytes written=" + nbytesWritten);
136 }
137 } catch (Exception e) {
138 result = false;
139 s_log.error("Exception", e);
140 }
141
142 return result;
143 }
144 }