1   package org.daisy.pipeline.tts.calabash.impl;
2   
3   import java.io.File;
4   import java.util.concurrent.atomic.AtomicReference;
5   
6   import javax.sound.sampled.AudioInputStream;
7   
8   import org.daisy.pipeline.audio.AudioClip;
9   import org.daisy.pipeline.tts.AudioFootprintMonitor;
10  
11  /**
12   * ContiguousPCMs are the message objects sent from TTS processors to the
13   * encoders. Every ContiguousPCM contains a AudioInputStream and attributes
14   * related to the URI of the sound file to produce.
15   */
16  class ContiguousPCM implements Comparable<ContiguousPCM> {
17  
18  	static ContiguousPCM EndOfQueue = new ContiguousPCM();
19  
20  	ContiguousPCM() {
21  		mEncodingTimeApprox = -1;
22  		mSizeInBytes = minByteSize();
23  	}
24  
25  	boolean isEndOfQueue() {
26  		return (mEncodingTimeApprox == -1);
27  	}
28  
29  	ContiguousPCM(AudioInputStream audio, File destdir, String destFilePrefix) {
30  		mAudio = audio;
31  		mDestDir = destdir;
32  		mDestFilePrefix = destFilePrefix;
33  		mDestFile = new AtomicReference<>();
34  		int size = AudioFootprintMonitor.getFootprint(audio);
35  		mSizeInBytes = minByteSize() + size;
36  		mEncodingTimeApprox = size / audio.getFormat().getSampleSizeInBits();
37  	}
38  
39  	@Override
40  	public int compareTo(ContiguousPCM o) {
41  		return (o.mEncodingTimeApprox - mEncodingTimeApprox); //descending order => biggest chunks will be polled first
42  	}
43  
44  	String getDestinationFilePrefix() {
45  		return mDestFilePrefix;
46  	}
47  
48  	File getDestinationDirectory() {
49  		return mDestDir;
50  	}
51  
52  	AudioInputStream getAudio() {
53  		return mAudio;
54  	}
55  
56  	AtomicReference<AudioClip> getDestinationFile() {
57  		return mDestFile;
58  	}
59  
60  	public int sizeInBytes() {
61  		return mSizeInBytes;
62  	}
63  
64  	private int minByteSize() {
65  		return 500;//rough approximation of an empty ContiguousPCM's memory footprint
66  	}
67  
68  	private AudioInputStream mAudio;
69  	private int mEncodingTimeApprox; //used for sorting
70  	private int mSizeInBytes; //used for monitoring the memory footprint
71  	private File mDestDir;
72  	private String mDestFilePrefix;
73  	private AtomicReference<AudioClip> mDestFile;
74  
75  }