2018-06-17 20:34:53 +08:00
|
|
|
/*
|
|
|
|
==============================================================================
|
|
|
|
|
|
|
|
This file is part of the JUCE library.
|
|
|
|
Copyright (c) 2017 - ROLI Ltd.
|
|
|
|
|
|
|
|
JUCE is an open source library subject to commercial or open-source
|
|
|
|
licensing.
|
|
|
|
|
|
|
|
The code included in this file is provided under the terms of the ISC license
|
|
|
|
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
|
|
|
To use, copy, modify, and/or distribute this software for any purpose with or
|
|
|
|
without fee is hereby granted provided that the above copyright notice and
|
|
|
|
this permission notice appear in all copies.
|
|
|
|
|
|
|
|
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
|
|
|
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
|
|
|
DISCLAIMED.
|
|
|
|
|
|
|
|
==============================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace juce
|
|
|
|
{
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/**
|
|
|
|
A subclass of AudioPlayHead can supply information about the position and
|
|
|
|
status of a moving play head during audio playback.
|
|
|
|
|
|
|
|
One of these can be supplied to an AudioProcessor object so that it can find
|
|
|
|
out about the position of the audio that it is rendering.
|
|
|
|
|
|
|
|
@see AudioProcessor::setPlayHead, AudioProcessor::getPlayHead
|
|
|
|
|
|
|
|
@tags{Audio}
|
|
|
|
*/
|
|
|
|
class JUCE_API AudioPlayHead
|
|
|
|
{
|
|
|
|
protected:
|
|
|
|
//==============================================================================
|
2019-06-23 03:41:38 +08:00
|
|
|
AudioPlayHead() = default;
|
2018-06-17 20:34:53 +08:00
|
|
|
|
|
|
|
public:
|
2019-06-23 03:41:38 +08:00
|
|
|
virtual ~AudioPlayHead() = default;
|
2018-06-17 20:34:53 +08:00
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Frame rate types. */
|
|
|
|
enum FrameRateType
|
|
|
|
{
|
|
|
|
fps23976 = 0,
|
|
|
|
fps24 = 1,
|
|
|
|
fps25 = 2,
|
|
|
|
fps2997 = 3,
|
|
|
|
fps30 = 4,
|
|
|
|
fps2997drop = 5,
|
|
|
|
fps30drop = 6,
|
|
|
|
fps60 = 7,
|
|
|
|
fps60drop = 8,
|
|
|
|
fpsUnknown = 99
|
|
|
|
};
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** This structure is filled-in by the AudioPlayHead::getCurrentPosition() method.
|
|
|
|
*/
|
|
|
|
struct JUCE_API CurrentPositionInfo
|
|
|
|
{
|
|
|
|
/** The tempo in BPM */
|
|
|
|
double bpm;
|
|
|
|
|
|
|
|
/** Time signature numerator, e.g. the 3 of a 3/4 time sig */
|
|
|
|
int timeSigNumerator;
|
|
|
|
/** Time signature denominator, e.g. the 4 of a 3/4 time sig */
|
|
|
|
int timeSigDenominator;
|
|
|
|
|
|
|
|
/** The current play position, in samples from the start of the timeline. */
|
|
|
|
int64 timeInSamples;
|
|
|
|
/** The current play position, in seconds from the start of the timeline. */
|
|
|
|
double timeInSeconds;
|
|
|
|
|
|
|
|
/** For timecode, the position of the start of the timeline, in seconds from 00:00:00:00. */
|
|
|
|
double editOriginTime;
|
|
|
|
|
|
|
|
/** The current play position, in units of quarter-notes. */
|
|
|
|
double ppqPosition;
|
|
|
|
|
|
|
|
/** The position of the start of the last bar, in units of quarter-notes.
|
|
|
|
|
|
|
|
This is the time from the start of the timeline to the start of the current
|
|
|
|
bar, in ppq units.
|
|
|
|
|
|
|
|
Note - this value may be unavailable on some hosts, e.g. Pro-Tools. If
|
|
|
|
it's not available, the value will be 0.
|
|
|
|
*/
|
|
|
|
double ppqPositionOfLastBarStart;
|
|
|
|
|
|
|
|
/** The video frame rate, if applicable. */
|
|
|
|
FrameRateType frameRate;
|
|
|
|
|
|
|
|
/** True if the transport is currently playing. */
|
|
|
|
bool isPlaying;
|
|
|
|
|
|
|
|
/** True if the transport is currently recording.
|
|
|
|
|
|
|
|
(When isRecording is true, then isPlaying will also be true).
|
|
|
|
*/
|
|
|
|
bool isRecording;
|
|
|
|
|
|
|
|
/** The current cycle start position in units of quarter-notes.
|
|
|
|
Note that not all hosts or plugin formats may provide this value.
|
|
|
|
@see isLooping
|
|
|
|
*/
|
|
|
|
double ppqLoopStart;
|
|
|
|
|
|
|
|
/** The current cycle end position in units of quarter-notes.
|
|
|
|
Note that not all hosts or plugin formats may provide this value.
|
|
|
|
@see isLooping
|
|
|
|
*/
|
|
|
|
double ppqLoopEnd;
|
|
|
|
|
|
|
|
/** True if the transport is currently looping. */
|
|
|
|
bool isLooping;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
bool operator== (const CurrentPositionInfo& other) const noexcept;
|
|
|
|
bool operator!= (const CurrentPositionInfo& other) const noexcept;
|
|
|
|
|
|
|
|
void resetToDefault();
|
|
|
|
};
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Fills-in the given structure with details about the transport's
|
|
|
|
position at the start of the current processing block. If this method returns
|
|
|
|
false then the current play head position is not available and the given
|
|
|
|
structure will be undefined.
|
|
|
|
|
|
|
|
You can ONLY call this from your processBlock() method! Calling it at other
|
|
|
|
times will produce undefined behaviour, as the host may not have any context
|
|
|
|
in which a time would make sense, and some hosts will almost certainly have
|
|
|
|
multithreading issues if it's not called on the audio thread.
|
|
|
|
*/
|
|
|
|
virtual bool getCurrentPosition (CurrentPositionInfo& result) = 0;
|
|
|
|
|
|
|
|
/** Returns true if this object can control the transport. */
|
|
|
|
virtual bool canControlTransport() { return false; }
|
|
|
|
|
|
|
|
/** Starts or stops the audio. */
|
|
|
|
virtual void transportPlay (bool shouldStartPlaying) { ignoreUnused (shouldStartPlaying); }
|
|
|
|
|
|
|
|
/** Starts or stops recording the audio. */
|
|
|
|
virtual void transportRecord (bool shouldStartRecording) { ignoreUnused (shouldStartRecording); }
|
|
|
|
|
|
|
|
/** Rewinds the audio. */
|
|
|
|
virtual void transportRewind() {}
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace juce
|