00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <alsa/asoundlib.h>
00024
00025 #include "audio_sample.h"
00026
00028
00029 typedef struct StoredSample
00030 {
00031 AudioSample *sample;
00032 int index;
00033 struct StoredSample *next;
00034 } StoredSample;
00035
00037
00038 typedef struct QueueItem
00039 {
00040 AudioSample *sample;
00041 bool temp;
00042 struct QueueItem *next;
00043 } QueueItem;
00044
00046
00047 typedef uint32_t ElemCap;
00048 const ElemCap ELEMCAP_CAN_PLAYBACK = 0x0001;
00049 const ElemCap ELEMCAP_CAN_CAPTURE = 0x0002;
00050 const ElemCap ELEMCAP_COMMON = 0x0004;
00051 const ElemCap ELEMCAP_PLAYBACK_VOL = 0x0008;
00052 const ElemCap ELEMCAP_CAPTURE_VOL = 0x0010;
00053 const ElemCap ELEMCAP_COMMON_VOL = 0x0020;
00054 const ElemCap ELEMCAP_PLAYBACK_SWITCH = 0x0040;
00055 const ElemCap ELEMCAP_CAPTURE_SWITCH = 0x0080;
00056 const ElemCap ELEMCAP_COMMON_SWITCH = 0x0100;
00057
00058
00059
00060
00061 typedef struct MixerElement
00062 {
00063 snd_mixer_elem_t *elem;
00064 long minPlayVol, curPlayVol, maxPlayVol;
00065 long minCapVol, curCapVol, maxCapVol;
00066 long minComVol, curComVol, maxComVol;
00067 int playSwitch, capSwitch, comSwitch;
00068 char *name;
00069 ElemCap caps;
00070 } MixerElement;
00071
00073
00074 typedef uint8_t PBState;
00075 const PBState PB_STATE_STOPPED = 0;
00076 const PBState PB_STATE_PLAYING = 1;
00077 const PBState PB_STATE_DRAIN = 2;
00078 const PBState PB_STATE_RECORDING = 3;
00079
00081
00082 class Alsa : public ThreadedDriver
00083 {
00084 public:
00085 Alsa (ConfigFile* cf, int section);
00086 ~Alsa (void);
00087
00088 virtual int ProcessMessage (QueuePointer &resp_queue, player_msghdr *hdr, void *data);
00089
00090 private:
00091
00092 bool useQueue;
00093 uint8_t debugLevel;
00094 char **mixerFilters;
00095 bool mixerFilterExact;
00096 char *pbDevice;
00097 char *mixerDevice;
00098 char *recDevice;
00099 uint32_t cfgPBPeriodTime;
00100 uint32_t cfgPBBufferTime;
00101 uint32_t silenceTime;
00102 uint32_t cfgRecBufferTime;
00103 uint32_t cfgRecStoreTime;
00104 uint32_t cfgRecPeriodTime;
00105 uint8_t recNumChannels;
00106 uint32_t recSampleRate;
00107 uint8_t recBits;
00108
00109
00110
00111 snd_pcm_t *pbHandle;
00112 int numPBFDs;
00113 struct pollfd *pbFDs;
00114 uint32_t actPBBufferTime;
00115 uint32_t actPBPeriodTime;
00116 snd_pcm_uframes_t pbPeriodSize;
00117 uint8_t *periodBuffer;
00118
00119 snd_pcm_t *recHandle;
00120 int numRecFDs;
00121 struct pollfd *recFDs;
00122 uint32_t actRecBufferTime;
00123 uint32_t actRecPeriodTime;
00124 snd_pcm_uframes_t recPeriodSize;
00125
00126 snd_mixer_t *mixerHandle;
00127 MixerElement *mixerElements;
00128 uint32_t numElements;
00129
00130
00131 int nextSampleIdx;
00132 StoredSample *samplesHead, *samplesTail;
00133 QueueItem *queueHead, *queueTail;
00134 PBState playState;
00135 PBState recState;
00136 uint32_t recDataLength;
00137 uint32_t recDataOffset;
00138 uint8_t *recData;
00139 int recDest;
00140
00141
00142
00143 virtual void Main (void);
00144 virtual int MainSetup (void);
00145 virtual void MainQuit (void);
00146 void SendStateMessage (void);
00147
00148
00149 bool AddStoredSample (StoredSample *newSample);
00150 bool AddStoredSample (player_audio_wav_t *waveData);
00151 bool AddStoredSample (const char *filePath);
00152 StoredSample* GetSampleAtIndex (int index);
00153
00154
00155 void ClearQueue (void);
00156 bool AddToQueue (QueueItem *newItem);
00157 bool AddToQueue (player_audio_wav_t *waveData);
00158 bool AddToQueue (AudioSample *sample);
00159 bool AddSilence (uint32_t time, AudioSample *format);
00160 void AdvanceQueue (void);
00161
00162
00163
00164
00165 bool SetupPlayBack (void);
00166 bool SetPBParams (AudioSample *sample);
00167 void PlaybackCallback (int numFrames);
00168
00169
00170 bool SetupRecord (void);
00171 bool SetRecParams (void);
00172 bool SetupRecordBuffer (uint32_t length);
00173 void RecordCallback (int numFrames);
00174 void HandleRecordedData (void);
00175 void PublishRecordedData (void);
00176
00177
00178 void StartPlayback (void);
00179 void StopPlayback (void);
00180 void StartRecording (void);
00181 void StopRecording (void);
00182
00183
00184 bool SetupMixer (void);
00185 bool EnumMixerElements (void);
00186 bool EnumElementCaps (MixerElement *element);
00187 MixerElement* SplitElements (MixerElement *elements, uint32_t &count);
00188 MixerElement* FilterElements (MixerElement *elements, uint32_t &count);
00189 void CleanUpMixerElements (MixerElement *elements, uint32_t count);
00190 void MixerDetailsToPlayer (player_audio_mixer_channel_list_detail_t *dest);
00191 void MixerLevelsToPlayer (player_audio_mixer_channel_list_t *dest);
00192 void SetElementLevel (uint32_t index, float level);
00193 void SetElementSwitch (uint32_t index, player_bool_t active);
00194 void PublishMixerData (void);
00195 float LevelToPlayer (long min, long max, long level);
00196 long LevelFromPlayer (long min, long max, float level);
00197 void PrintMixerElements (MixerElement *elements, uint32_t count);
00198
00199
00200 int HandleWavePlayCmd (player_audio_wav_t *waveData);
00201 int HandleSamplePlayCmd (player_audio_sample_item_t *data);
00202 int HandleRecordCmd (player_bool_t *data);
00203 int HandleMixerChannelCmd (player_audio_mixer_channel_list_t *data);
00204 int HandleSampleLoadReq (player_audio_sample_t *data, QueuePointer &resp_queue);
00205 int HandleSampleRetrieveReq (player_audio_sample_t *data, QueuePointer &resp_queue);
00206 int HandleSampleRecordReq (player_audio_sample_rec_req_t *data, QueuePointer &resp_queue);
00207 int HandleMixerChannelListReq (player_audio_mixer_channel_list_detail_t *data, QueuePointer &resp_queue);
00208 int HandleMixerChannelLevelReq (player_audio_mixer_channel_list_t *data, QueuePointer &resp_queue);
00209 };