#ifndef ToneProducer_H
#define ToneProducer_H 1
#include <media/BufferProducer.h>
#include <media/MediaEventLooper.h>
#include <media/Controllable.h>
class BMediaAddOn;
class ToneProducer : public BBufferProducer, public BControllable, public BMediaEventLooper
{
public:
enum event_t {
_PARAMETER_EVENT = BTimedEventQueue::B_USER_EVENT
};
public:
ToneProducer(BMediaAddOn* pAddOn=0);
~ToneProducer();
BMediaAddOn* AddOn( int32* internal_id) const;
status_t GetParameterValue(
int32 id,
bigtime_t* last_change,
void* value,
size_t* ioSize);
void SetParameterValue(
int32 id,
bigtime_t when,
const void* value,
size_t size);
status_t StartControlPanel(
BMessenger* pMessenger);
status_t FormatSuggestionRequested(
media_type type,
int32 quality,
media_format* format);
status_t FormatProposal(
const media_source& output,
media_format* format);
status_t FormatChangeRequested(
const media_source& source,
const media_destination& destination,
media_format* io_format,
int32* _deprecated_);
status_t GetNextOutput(
int32* cookie,
media_output* out_output);
status_t DisposeOutputCookie(
int32 cookie);
status_t SetBufferGroup(
const media_source& for_source,
BBufferGroup* group);
status_t GetLatency(
bigtime_t* out_latency);
status_t PrepareToConnect(
const media_source& what,
const media_destination& where,
media_format* format,
media_source* out_source,
char* out_name);
void Connect(
status_t error,
const media_source& source,
const media_destination& destination,
const media_format& format,
char* io_name);
void Disconnect(
const media_source& what,
const media_destination& where);
void LateNoticeReceived(
const media_source& what,
bigtime_t how_much,
bigtime_t performance_time);
void EnableOutput(
const media_source & what,
bool enabled,
int32* _deprecated_);
status_t SetPlayRate(
int32 numer,
int32 denom);
status_t HandleMessage(
int32 message,
const void* data,
size_t size);
void AdditionalBufferRequested(
const media_source& source,
media_buffer_id prev_buffer,
bigtime_t prev_time,
const media_seek_tag* prev_tag);
void LatencyChanged(
const media_source& source,
const media_destination& destination,
bigtime_t new_latency,
uint32 flags);
void NodeRegistered();
void Start(bigtime_t performance_time);
void Stop(bigtime_t performance_time, bool immediate);
void SetRunMode(run_mode mode);
void HandleEvent(
const media_timed_event* event,
bigtime_t lateness,
bool realTimeEvent = false);
private:
void AllocateBuffers();
BBuffer* FillNextBuffer(bigtime_t event_time);
void FillSineBuffer(float* data, size_t numFrames, bool stereo);
void FillTriangleBuffer(float* data, size_t numFrames, bool stereo);
void FillSawtoothBuffer(float* data, size_t numFrames, bool stereo);
BParameterWeb* mWeb;
BBufferGroup* mBufferGroup;
bigtime_t mLatency, mInternalLatency;
media_output mOutput;
bool mOutputEnabled;
media_format mPreferredFormat;
double mTheta;
bool mWaveAscending;
float mFrequency;
float mGain;
int32 mWaveform;
uint64 mFramesSent;
bigtime_t mStartTime;
bigtime_t mGainLastChanged;
bigtime_t mFreqLastChanged;
bigtime_t mWaveLastChanged;
BMediaAddOn* m_pAddOn;
};
#endif