* Copyright (c) 1999-2000, Eric Moon.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions, and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions, and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __FlangerNode_H__
#define __FlangerNode_H__
#include <BufferProducer.h>
#include <BufferConsumer.h>
#include <Controllable.h>
#include <MediaEventLooper.h>
class BBufferGroup;
class BMediaAddOn;
class AudioBuffer;
class FlangerNode :
public BBufferConsumer,
public BBufferProducer,
public BControllable,
public BMediaEventLooper {
public:
virtual ~FlangerNode();
FlangerNode(BMediaAddOn* pAddOn=0);
public:
virtual status_t HandleMessage(
int32 code,
const void* pData,
size_t size);
virtual BMediaAddOn* AddOn(
int32* poID) const;
virtual void SetRunMode(
run_mode mode);
protected:
virtual void HandleEvent(
const media_timed_event* pEvent,
bigtime_t howLate,
bool realTimeEvent=false);
protected:
virtual void NodeRegistered();
virtual bigtime_t OfflineTime();
public:
virtual status_t AcceptFormat(
const media_destination& destination,
media_format* pioFormat);
virtual void BufferReceived(
BBuffer* pBuffer);
virtual status_t Connected(
const media_source& source,
const media_destination& destination,
const media_format& format,
media_input* poInput);
virtual void Disconnected(
const media_source& source,
const media_destination& destination);
virtual void DisposeInputCookie(
int32 cookie);
virtual status_t FormatChanged(
const media_source& source,
const media_destination& destination,
int32 changeTag,
const media_format& newFormat);
virtual status_t GetLatencyFor(
const media_destination& destination,
bigtime_t* poLatency,
media_node_id* poTimeSource);
virtual status_t GetNextInput(
int32* pioCookie,
media_input* poInput);
virtual void ProducerDataStatus(
const media_destination& destination,
int32 status,
bigtime_t tpWhen);
virtual status_t SeekTagRequested(
const media_destination& destination,
bigtime_t targetTime,
uint32 flags,
media_seek_tag* poSeekTag,
bigtime_t* poTaggedTime,
uint32* poFlags);
public:
virtual void AdditionalBufferRequested(
const media_source& source,
media_buffer_id previousBufferID,
bigtime_t previousTime,
const media_seek_tag* pPreviousTag);
virtual void Connect(
status_t status,
const media_source& source,
const media_destination& destination,
const media_format& format,
char* pioName);
virtual void Disconnect(
const media_source& source,
const media_destination& destination);
virtual status_t DisposeOutputCookie(
int32 cookie);
virtual void EnableOutput(
const media_source& source,
bool enabled,
int32* _deprecated_);
virtual status_t FormatChangeRequested(
const media_source& source,
const media_destination& destination,
media_format* pioFormat,
int32* _deprecated_);
virtual status_t FormatProposal(
const media_source& source,
media_format* pioFormat);
virtual status_t FormatSuggestionRequested(
media_type type,
int32 quality,
media_format* poFormat);
virtual status_t GetLatency(
bigtime_t* poLatency);
virtual status_t GetNextOutput(
int32* pioCookie,
media_output* poOutput);
virtual void LatencyChanged(
const media_source& source,
const media_destination& destination,
bigtime_t newLatency,
uint32 flags);
virtual void LateNoticeReceived(
const media_source& source,
bigtime_t howLate,
bigtime_t tpWhen);
virtual status_t PrepareToConnect(
const media_source& source,
const media_destination& destination,
media_format* pioFormat,
media_source* poSource,
char* poName);
virtual status_t SetBufferGroup(
const media_source& source,
BBufferGroup* pGroup);
virtual status_t SetPlayRate(
int32 numerator,
int32 denominator);
virtual status_t VideoClippingChanged(
const media_source& source,
int16 numShorts,
int16* pClipData,
const media_video_display_info& display,
int32* poFromChangeTag);
public:
virtual status_t GetParameterValue(
int32 id,
bigtime_t* poLastChangeTime,
void* poValue,
size_t* pioSize);
virtual void SetParameterValue(
int32 id,
bigtime_t changeTime,
const void* pValue,
size_t size);
protected:
void handleParameterEvent(
const media_timed_event* pEvent);
void handleStartEvent(
const media_timed_event* pEvent);
void handleStopEvent(
const media_timed_event* pEvent);
void ignoreEvent(
const media_timed_event* pEvent);
protected:
virtual void getPreferredFormat(
media_format& ioFormat);
status_t validateProposedFormat(
const media_format& preferredFormat,
media_format& ioProposedFormat);
void specializeOutputFormat(
media_format& ioFormat);
virtual void initParameterValues();
virtual void initParameterWeb();
virtual void initFilter();
virtual void startFilter();
virtual void stopFilter();
virtual bigtime_t calcProcessingLatency();
virtual void filterBuffer(
BBuffer* pBuffer);
private:
media_format m_preferredFormat;
media_format m_format;
media_input m_input;
media_output m_output;
bool m_outputEnabled;
bigtime_t m_downstreamLatency;
bigtime_t m_processingLatency;
private:
uint64 m_framesSent;
AudioBuffer* m_pDelayBuffer;
uint32 m_delayWriteFrame;
float m_fTheta;
float m_fThetaInc;
float m_fSweepBase;
float m_fSweepFactor;
static const float s_fMaxDelay;
private:
float m_fMixRatio;
bigtime_t m_tpMixRatioChanged;
float m_fSweepRate;
bigtime_t m_tpSweepRateChanged;
float m_fDelay;
bigtime_t m_tpDelayChanged;
float m_fDepth;
bigtime_t m_tpDepthChanged;
float m_fFeedback;
bigtime_t m_tpFeedbackChanged;
private:
BMediaAddOn* m_pAddOn;
static const char* const s_nodeName;
};
#endif