/** * {@inheritDoc} * * @see org.openimaj.time.TimeKeeper#getTime() */ @Override public AudioTimecode getTime() { // If we've not yet read any samples, just return the timecode // object as it was first given to us. if (this.timecodeReadAt == 0) return this.currentTimecode; // Update the timecode if we're playing (otherwise we'll return the // latest timecode) if (this.mode == Mode.PLAY) this.currentTimecode.setTimecodeInMilliseconds(this.currentTimestamp + (System.currentTimeMillis() - this.timecodeReadAt)); return this.currentTimecode; }
/** * {@inheritDoc} */ @Override public AudioTimecode clone() { return new AudioTimecode( milliseconds ); } }
/** * {@inheritDoc} */ @Override public SampleChunk clone() { return new SampleChunk(this.samples.clone(), this.format.clone(), this.startTimecode == null ? new AudioTimecode( 0) : this.startTimecode.clone()); }
@Override public SampleChunk nextSampleChunk() { if( this.listIndex >= samples.size() ) return null; if( this.l == null || this.index >= this.l.size() ) { this.l = samples.get(this.listIndex); this.index = 0; this.listIndex++; this.timecodeOffset += this.currentTimecode; } // Get the current sample chunk final SampleChunk sc = this.l.get(this.index).getSampleChunk(); // Work out the timecode at the end of the sample chunk this.currentTimecode = (long)(sc.getStartTimecode().getTimecodeInMilliseconds() + sc.getNumberOfSamples() / sc.getFormat().getSampleRateKHz()); // Add the offset into the current timecode. sc.getStartTimecode().setTimecodeInMilliseconds( sc.getStartTimecode().getTimecodeInMilliseconds() + this.timecodeOffset ); this.index++; return sc; }
s.setStartTimecode(new AudioTimecode( this.getStartTimecode().getTimecodeInMilliseconds() + (long) (start / samplesPerChannelPerMillisec)));
/** * Prepends the given samples to the front of this sample chunk. It is * expected that the given samples are in the same format as this sample * chunk; if they are not an exception is thrown. Side-affects this sample * chunk and will return a reference to this sample chunk. * * @param sample * the samples to add * @return This sample chunk with the bytes prepended */ public SampleChunk prepend(final SampleChunk sample) { // Check the sample formats are the same if (!sample.getFormat().equals(this.format)) throw new IllegalArgumentException("Sample types are not equivalent"); // Get the samples from the given chunk final byte[] x1 = sample.getSamplesAsByteBuffer().array(); // Create an array for the concatenated pair final byte[] newSamples = new byte[this.samples.length + x1.length]; // Loop through adding the new samples System.arraycopy(x1, 0, newSamples, 0, x1.length); synchronized (this.samples) { System.arraycopy(this.samples, 0, newSamples, x1.length, this.samples.length); } // Update this object this.samples = newSamples; this.setStartTimecode(sample.getStartTimecode().clone()); return this; }
@Override public SampleChunk nextSampleChunk() { if( this.listIndex >= samples.size() ) return null; if( this.l == null || this.index >= this.l.size() ) { this.l = samples.get(this.listIndex); this.index = 0; this.listIndex++; this.timecodeOffset += this.currentTimecode; } // Get the current sample chunk final SampleChunk sc = this.l.get(this.index).getSampleChunk(); // Work out the timecode at the end of the sample chunk this.currentTimecode = (long)(sc.getStartTimecode().getTimecodeInMilliseconds() + sc.getNumberOfSamples() / sc.getFormat().getSampleRateKHz()); // Add the offset into the current timecode. sc.getStartTimecode().setTimecodeInMilliseconds( sc.getStartTimecode().getTimecodeInMilliseconds() + this.timecodeOffset ); this.index++; return sc; }
s.setStartTimecode(new AudioTimecode( this.getStartTimecode().getTimecodeInMilliseconds() + (long) (start / samplesPerChannelPerMillisec)));
/** * Prepends the given samples to the front of this sample chunk. It is * expected that the given samples are in the same format as this sample * chunk; if they are not an exception is thrown. Side-affects this sample * chunk and will return a reference to this sample chunk. * * @param sample * the samples to add * @return This sample chunk with the bytes prepended */ public SampleChunk prepend(final SampleChunk sample) { // Check the sample formats are the same if (!sample.getFormat().equals(this.format)) throw new IllegalArgumentException("Sample types are not equivalent"); // Get the samples from the given chunk final byte[] x1 = sample.getSamplesAsByteBuffer().array(); // Create an array for the concatenated pair final byte[] newSamples = new byte[this.samples.length + x1.length]; // Loop through adding the new samples System.arraycopy(x1, 0, newSamples, 0, x1.length); synchronized (this.samples) { System.arraycopy(this.samples, 0, newSamples, x1.length, this.samples.length); } // Update this object this.samples = newSamples; this.setStartTimecode(sample.getStartTimecode().clone()); return this; }
/** * {@inheritDoc} * @see org.openimaj.audio.processor.AudioProcessor#process(org.openimaj.audio.SampleChunk) */ @Override public SampleChunk process( final SampleChunk samples ) { // Detect beats. Note that we stop as soon as we detect a beat. this.beatDetected = false; final SampleBuffer sb = samples.getSampleBuffer(); int i = 0; for(; i < sb.size(); i++ ) { if( this.beatDetected = this.processSample( sb.get(i) ) ) break; } if( this.beatDetected() ) this.beatTimecode.setTimecodeInMilliseconds( (long)( samples.getStartTimecode().getTimecodeInMilliseconds() + i * this.format.getSampleRateKHz() ) ); // System.out.println( beatDetected ); // We return the samples unaltered return samples; }
/** * {@inheritDoc} * * @see org.openimaj.time.TimeKeeper#getTime() */ @Override public AudioTimecode getTime() { // If we've not yet read any samples, just return the timecode // object as it was first given to us. if (this.timecodeReadAt == 0) return this.currentTimecode; // Update the timecode if we're playing (otherwise we'll return the // latest timecode) if (this.mode == Mode.PLAY) this.currentTimecode.setTimecodeInMilliseconds(this.currentTimestamp + (System.currentTimeMillis() - this.timecodeReadAt)); return this.currentTimecode; }
/** * {@inheritDoc} */ @Override public AudioTimecode clone() { return new AudioTimecode( milliseconds ); } }
/** * {@inheritDoc} */ @Override public SampleChunk clone() { return new SampleChunk(this.samples.clone(), this.format.clone(), this.startTimecode == null ? new AudioTimecode( 0) : this.startTimecode.clone()); }
/** * {@inheritDoc} * @see org.openimaj.audio.processor.AudioProcessor#process(org.openimaj.audio.SampleChunk) */ @Override public SampleChunk process( final SampleChunk samples ) { // Detect beats. Note that we stop as soon as we detect a beat. this.beatDetected = false; final SampleBuffer sb = samples.getSampleBuffer(); int i = 0; for(; i < sb.size(); i++ ) { if( this.beatDetected = this.processSample( sb.get(i) ) ) break; } if( this.beatDetected() ) this.beatTimecode.setTimecodeInMilliseconds( (long)( samples.getStartTimecode().getTimecodeInMilliseconds() + i * this.format.getSampleRateKHz() ) ); // System.out.println( beatDetected ); // We return the samples unaltered return samples; }
/** * {@inheritDoc} * * @see org.openimaj.time.TimeKeeper#reset() */ @Override public void reset() { this.timecodeReadAt = 0; this.currentTimestamp = 0; this.started = false; this.currentTimecode.setTimecodeInMilliseconds(0); this.stream.reset(); }
/** * Play the given stream to a specific device. * * @param a * The audio stream to play. * @param deviceName * The device to play the audio to. */ public AudioPlayer(final AudioStream a, final String deviceName) { this.stream = a; this.deviceName = deviceName; this.setTimecodeObject(new AudioTimecode(0)); }
getTimecodeInMilliseconds(); this.timecodeReadAt = System.currentTimeMillis(); this.currentTimecode.setTimecodeInMilliseconds(this.currentTimestamp);
/** * {@inheritDoc} * * @see org.openimaj.time.TimeKeeper#pause() */ @Override public void pause() { this.setMode(Mode.PAUSE); // Set the current timecode to the time at which we paused. this.currentTimecode.setTimecodeInMilliseconds(this.currentTimestamp + (System.currentTimeMillis() - this.timecodeReadAt)); } }
/** * Play the given stream to a specific device. * * @param a * The audio stream to play. * @param deviceName * The device to play the audio to. */ public AudioPlayer(final AudioStream a, final String deviceName) { this.stream = a; this.deviceName = deviceName; this.setTimecodeObject(new AudioTimecode(0)); }
getTimecodeInMilliseconds(); this.timecodeReadAt = System.currentTimeMillis(); this.currentTimecode.setTimecodeInMilliseconds(this.currentTimestamp);