1 /* 2 * Copyright 2002 David Shipman, 3 * Copyright 2003-2007 Marcus Overhagen 4 * Copyright 2007 Haiku Inc. All rights reserved. 5 * Distributed under the terms of the MIT License. 6 */ 7 #ifndef _AUDIOMIXER_H 8 #define _AUDIOMIXER_H 9 10 11 #include <BufferConsumer.h> 12 #include <BufferGroup.h> 13 #include <BufferProducer.h> 14 #include <Controllable.h> 15 #include <MediaEventLooper.h> 16 #include <MediaNode.h> 17 18 19 class MixerCore; 20 21 22 class AudioMixer : public BBufferConsumer, public BBufferProducer, 23 public BControllable, public BMediaEventLooper { 24 public: 25 AudioMixer(BMediaAddOn *addOn, bool isSystemMixer); 26 ~AudioMixer(); 27 28 void DisableNodeStop(); 29 30 // AudioMixer support 31 void ApplySettings(); 32 33 void PublishEventLatencyChange(); 34 void UpdateParameterWeb(); 35 36 void HandleInputBuffer(BBuffer *buffer, bigtime_t lateness); 37 38 BBufferGroup * CreateBufferGroup(); 39 40 float dB_to_Gain(float db); 41 float Gain_to_dB(float gain); 42 43 // BMediaNode methods 44 BMediaAddOn * AddOn(int32 *internal_id) const; 45 void NodeRegistered(); 46 void Stop(bigtime_t performance_time, bool immediate); 47 void SetTimeSource(BTimeSource * time_source); 48 using BBufferProducer::SendBuffer; 49 50 protected: 51 // BControllable methods 52 status_t GetParameterValue(int32 id, 53 bigtime_t *last_change, 54 void *value, 55 size_t *ioSize); 56 57 void SetParameterValue(int32 id, bigtime_t when, 58 const void *value, 59 size_t size); 60 61 // BBufferConsumer methods 62 status_t HandleMessage(int32 message, const void* data, 63 size_t size); 64 status_t AcceptFormat(const media_destination &dest, 65 media_format *format); 66 status_t GetNextInput(int32 *cookie, 67 media_input *out_input); 68 void DisposeInputCookie(int32 cookie); 69 void BufferReceived(BBuffer *buffer); 70 void ProducerDataStatus(const media_destination &for_whom, 71 int32 status, 72 bigtime_t at_performance_time); 73 status_t GetLatencyFor(const media_destination &for_whom, 74 bigtime_t *out_latency, 75 media_node_id *out_timesource); 76 status_t Connected(const media_source &producer, 77 const media_destination &where, 78 const media_format &with_format, 79 media_input *out_input); 80 void Disconnected(const media_source &producer, 81 const media_destination &where); 82 status_t FormatChanged(const media_source &producer, 83 const media_destination &consumer, 84 int32 change_tag, 85 const media_format &format); 86 87 // BBufferProducer methods 88 status_t FormatSuggestionRequested(media_type type, 89 int32 quality, 90 media_format *format); 91 status_t FormatProposal(const media_source &output, 92 media_format *format); 93 status_t FormatChangeRequested( 94 const media_source& source, 95 const media_destination &destination, 96 media_format *io_format, 97 int32 *_deprecated_); 98 status_t GetNextOutput(int32 *cookie,media_output *out_output); 99 status_t DisposeOutputCookie(int32 cookie); 100 status_t SetBufferGroup(const media_source &for_source, 101 BBufferGroup *group); 102 status_t GetLatency(bigtime_t *out_latency); 103 status_t PrepareToConnect(const media_source &what, 104 const media_destination &where, 105 media_format *format, 106 media_source *out_source, 107 char *out_name); 108 void Connect(status_t error, 109 const media_source &source, 110 const media_destination &destination, 111 const media_format &format, 112 char *io_name); 113 void Disconnect(const media_source &what, 114 const media_destination &where); 115 void LateNoticeReceived(const media_source &what, 116 bigtime_t how_much, 117 bigtime_t performance_time); 118 void EnableOutput(const media_source &what, 119 bool enabled, 120 int32 *_deprecated_); 121 void LatencyChanged(const media_source &source, 122 const media_destination &destination, 123 bigtime_t new_latency, uint32 flags); 124 125 // BMediaEventLooper methods 126 void HandleEvent(const media_timed_event *event, 127 bigtime_t lateness, 128 bool realTimeEvent = false); 129 130 private: 131 BMediaAddOn *fAddOn; 132 MixerCore *fCore; 133 BParameterWeb *fWeb; // local pointer to parameterweb 134 BBufferGroup *fBufferGroup; 135 bigtime_t fDownstreamLatency; 136 bigtime_t fInternalLatency; 137 bool fDisableStop; 138 media_format fDefaultFormat; 139 }; 140 141 #endif // _AUDIOMIXER_H 142