23 #include <alsa/asoundlib.h>
25 #include "audio_sample.h"
47 typedef uint32_t ElemCap;
48 const ElemCap ELEMCAP_CAN_PLAYBACK = 0x0001;
49 const ElemCap ELEMCAP_CAN_CAPTURE = 0x0002;
50 const ElemCap ELEMCAP_COMMON = 0x0004;
51 const ElemCap ELEMCAP_PLAYBACK_VOL = 0x0008;
52 const ElemCap ELEMCAP_CAPTURE_VOL = 0x0010;
53 const ElemCap ELEMCAP_COMMON_VOL = 0x0020;
54 const ElemCap ELEMCAP_PLAYBACK_SWITCH = 0x0040;
55 const ElemCap ELEMCAP_CAPTURE_SWITCH = 0x0080;
56 const ElemCap ELEMCAP_COMMON_SWITCH = 0x0100;
63 snd_mixer_elem_t *elem;
64 long minPlayVol, curPlayVol, maxPlayVol;
65 long minCapVol, curCapVol, maxCapVol;
66 long minComVol, curComVol, maxComVol;
67 int playSwitch, capSwitch, comSwitch;
74 typedef uint8_t PBState;
75 const PBState PB_STATE_STOPPED = 0;
76 const PBState PB_STATE_PLAYING = 1;
77 const PBState PB_STATE_DRAIN = 2;
78 const PBState PB_STATE_RECORDING = 3;
95 bool mixerFilterExact;
99 uint32_t cfgPBPeriodTime;
100 uint32_t cfgPBBufferTime;
101 uint32_t silenceTime;
102 uint32_t cfgRecBufferTime;
103 uint32_t cfgRecStoreTime;
104 uint32_t cfgRecPeriodTime;
105 uint8_t recNumChannels;
106 uint32_t recSampleRate;
113 struct pollfd *pbFDs;
114 uint32_t actPBBufferTime;
115 uint32_t actPBPeriodTime;
116 snd_pcm_uframes_t pbPeriodSize;
117 uint8_t *periodBuffer;
119 snd_pcm_t *recHandle;
121 struct pollfd *recFDs;
122 uint32_t actRecBufferTime;
123 uint32_t actRecPeriodTime;
124 snd_pcm_uframes_t recPeriodSize;
126 snd_mixer_t *mixerHandle;
128 uint32_t numElements;
136 uint32_t recDataLength;
137 uint32_t recDataOffset;
143 virtual void Main (
void);
146 void SendStateMessage (
void);
150 bool AddStoredSample (player_audio_wav_t *waveData);
151 bool AddStoredSample (
const char *filePath);
155 void ClearQueue (
void);
157 bool AddToQueue (player_audio_wav_t *waveData);
159 bool AddSilence (uint32_t time,
AudioSample *format);
160 void AdvanceQueue (
void);
165 bool SetupPlayBack (
void);
167 void PlaybackCallback (
int numFrames);
170 bool SetupRecord (
void);
171 bool SetRecParams (
void);
172 bool SetupRecordBuffer (uint32_t length);
173 void RecordCallback (
int numFrames);
174 void HandleRecordedData (
void);
175 void PublishRecordedData (
void);
178 void StartPlayback (
void);
179 void StopPlayback (
void);
180 void StartRecording (
void);
181 void StopRecording (
void);
184 bool SetupMixer (
void);
185 bool EnumMixerElements (
void);
189 void CleanUpMixerElements (
MixerElement *elements, uint32_t count);
190 void MixerDetailsToPlayer (player_audio_mixer_channel_list_detail_t *dest);
191 void MixerLevelsToPlayer (player_audio_mixer_channel_list_t *dest);
192 void SetElementLevel (uint32_t index,
float level);
193 void SetElementSwitch (uint32_t index,
player_bool_t active);
194 void PublishMixerData (
void);
195 float LevelToPlayer (
long min,
long max,
long level);
196 long LevelFromPlayer (
long min,
long max,
float level);
197 void PrintMixerElements (
MixerElement *elements, uint32_t count);
200 int HandleWavePlayCmd (player_audio_wav_t *waveData);
201 int HandleSamplePlayCmd (player_audio_sample_item_t *data);
203 int HandleMixerChannelCmd (player_audio_mixer_channel_list_t *data);
204 int HandleSampleLoadReq (player_audio_sample_t *data,
QueuePointer &resp_queue);
205 int HandleSampleRetrieveReq (player_audio_sample_t *data,
QueuePointer &resp_queue);
206 int HandleSampleRecordReq (player_audio_sample_rec_req_t *data,
QueuePointer &resp_queue);
207 int HandleMixerChannelListReq (player_audio_mixer_channel_list_detail_t *data,
QueuePointer &resp_queue);
208 int HandleMixerChannelLevelReq (player_audio_mixer_channel_list_t *data,
QueuePointer &resp_queue);
T min(T a, T b)
Return the minimum of a, b.
Definition: utility.h:113
#define PLAYER_WARN1(msg, a)
Error message macros.
Definition: error.h:90
#define PLAYER_MSG1(level, msg, a)
Error message macros.
Definition: error.h:106
virtual void Publish(player_devaddr_t addr, QueuePointer &queue, uint8_t type, uint8_t subtype, void *src=NULL, size_t deprecated=0, double *timestamp=NULL, bool copy=true)
Publish a message via one of this driver's interfaces.
static bool MatchMessage(player_msghdr_t *hdr, int type, int subtype, player_devaddr_t addr)
Helper for message processing.
Definition: message.h:159
#define PLAYER_MAX_PAYLOAD_SIZE
Maximum payload in a message.
Definition: player.h:70
double ReadFloat(int section, const char *name, double value)
Read a floating point (double) value.
virtual int MainSetup(void)
Sets up the resources needed by the driver thread.
Definition: alsa.cc:2156
double ReadTupleLength(int section, const char *name, int index, double value)
Read a length from a tuple (includes units conversion)
Generic message header.
Definition: player.h:162
virtual int MainSetup(void)
Sets up the resources needed by the driver thread.
Definition: driver.h:658
virtual void MainQuit(void)
Cleanup method for driver thread (called when main exits)
Definition: driver.h:664
Encapsulates a device (i.e., a driver bound to an interface)
Definition: device.h:75
const char * ReadString(int section, const char *name, const char *value)
Read a string value.
uint8_t subtype
Message subtype; interface specific.
Definition: player.h:168
virtual void Main(void)=0
Main method for driver thread.
const char * ReadTupleString(int section, const char *name, int index, const char *value)
Read a string from a tuple field.
const char * ReadFilename(int section, const char *name, const char *value)
Read a filename.
int ReadInt(int section, const char *name, int value)
Read an integer value.
void ProcessMessages(void)
Process pending messages.
#define PLAYER_MSGTYPE_DATA
A data message.
Definition: player.h:95
QueuePointer InQueue
Queue for all incoming messages for this driver.
Definition: driver.h:285
#define PLAYER_ERROR2(msg, a, b)
Error message macros.
Definition: error.h:83
#define PLAYER_MSGTYPE_RESP_ACK
A positive response message.
Definition: player.h:112
#define PLAYER_WARN2(msg, a, b)
Error message macros.
Definition: error.h:91
Definition: audio_sample.h:33
virtual int ProcessMessage(QueuePointer &resp_queue, player_msghdr *hdr, void *data)
Message handler.
bool ReadBool(int section, const char *name, bool value)
Read a boolean value (one of: yes, no, true, false, 1, 0)
virtual int ProcessMessage(QueuePointer &resp_queue, player_msghdr *hdr, void *data)
Message handler.
Definition: alsa.cc:2575
#define PLAYER_MSGTYPE_REQ
A request message.
Definition: player.h:106
uint32_t ReadTupleColor(int section, const char *name, int index, uint32_t value)
Read a color (includes text to RGB conversion)
#define PLAYER_MSGTYPE_RESP_NACK
A negative response message.
Definition: player.h:125
double ReadTupleAngle(int section, const char *name, int index, double value)
Read an angle form a tuple (includes units conversion)
int ReadDeviceAddr(player_devaddr_t *addr, int section, const char *name, int code, int index, const char *key)
Read a device id.
int GetTupleCount(int section, const char *name)
Get the number of values in a tuple.
Class for loading configuration file information.
Definition: configfile.h:197
int ReadTupleInt(int section, const char *name, int index, int value)
Read an integer from a tuple field.
#define PLAYER_CAPABILITIES_REQ
Capability request message type.
Definition: player.h:397
A device address.
Definition: player.h:146
An autopointer for the message queue.
Definition: message.h:74
uint8_t state
state
Definition: player.h:336
A boolean variable, 0 for false anything else for true.
Definition: player.h:334
#define PLAYER_ERROR1(msg, a)
Error message macros.
Definition: error.h:82
bool Empty()
Check whether a queue is empty.
Definition: message.h:345
A pose in space.
Definition: player.h:229
#define PLAYER_ERROR(msg)
Error message macros.
Definition: error.h:81
player_devaddr_t device_addr
Default device address (single-interface drivers)
Definition: driver.h:269
Base class for drivers which oeprate with a thread.
Definition: driver.h:553
virtual void Main(void)
Main method for driver thread.
Definition: alsa.cc:2257
virtual void MainQuit(void)
Cleanup method for driver thread (called when main exits)
Definition: alsa.cc:2197
#define PLAYER_WARN(msg)
Warning message macros.
Definition: error.h:89
#define PLAYER_MSGTYPE_CMD
A command message.
Definition: player.h:99
Base class for all drivers.
Definition: driver.h:109
#define PLAYER_MSG0(level, msg)
General messages.
Definition: error.h:105
#define PLAYER_MSGQUEUE_DEFAULT_MAXLEN
Default maximum length for a message queue.
Definition: player.h:76
T max(T a, T b)
Return the maximum of a, b.
Definition: utility.h:126