From: Toby C. <th...@us...> - 2006-05-08 11:01:18
|
Update of /cvsroot/playerstage/code/player/client_libs/libplayerc++ In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14471/client_libs/libplayerc++ Modified Files: Makefile.am audioproxy.cc playerc++.h Log Message: major overhaul of audio interface and associated proxies minor fixes to other c client proxies and tests to remove build warnings Index: playerc++.h =================================================================== RCS file: /cvsroot/playerstage/code/player/client_libs/libplayerc++/playerc++.h,v retrieving revision 1.59 retrieving revision 1.60 diff -C2 -d -r1.59 -r1.60 *** playerc++.h 5 May 2006 06:09:34 -0000 1.59 --- playerc++.h 8 May 2006 12:39:07 -0000 1.60 *************** *** 192,224 **** ! // /** ! // The @p AudioProxy class controls an @ref interface_audio device. ! // */ ! // class AudioProxy : public ClientProxy ! // { ! // ! // private: ! // ! // void Subscribe(uint aIndex); ! // void Unsubscribe(); ! // ! // // libplayerc data structure ! // playerc_audio_t *mDevice; ! // ! // public: ! // ! // AudioProxy(PlayerClient *aPc, uint aIndex=0) ! // ~AudioProxy(); ! // ! // uint GetCount() const { return(GetVar(mDevice->count)); }; ! // ! // double GetFrequency(uint aIndex) const ! // { return(GetVar(mDevice->frequency[aIndex])); }; ! // double GetAmplitude(uint aIndex) const ! // { return(GetVar(mDevice->amplitude[aIndex])); }; ! // ! // // Play a fixed-frequency tone ! // void PlayTone(uint aFreq, uint aAmp, uint aDur); ! // }; // /** --- 192,286 ---- ! /** ! The @p AudioProxy class controls an @ref interface_audio device. ! */ ! class AudioProxy : public ClientProxy ! { ! ! private: ! ! void Subscribe(uint aIndex); ! void Unsubscribe(); ! ! // libplayerc data structure ! playerc_audio_t *mDevice; ! ! public: ! ! AudioProxy(PlayerClient *aPc, uint aIndex=0); ! ~AudioProxy(); ! ! /** @brief Get Mixer Details Count */ ! uint GetMixerDetailsCount() const {return(GetVar(mDevice->channel_details_list.details_count));}; ! /** @brief Get Mixer Detail */ ! player_audio_mixer_channel_detail_t GetMixerDetails(int aIndex) const {return(GetVar(mDevice->channel_details_list.details[aIndex]));}; ! /** @brief Get Default output Channel */ ! uint GetDefaultOutputChannel() const {return(GetVar(mDevice->channel_details_list.default_output));}; ! /** @brief Get Default input Channel */ ! uint GetDefaultInputChannel() const {return(GetVar(mDevice->channel_details_list.default_input));}; ! ! /** @brief Get Wav data length */ ! uint GetWavDataLength() const {return(GetVar(mDevice->wav_data.data_count));}; ! /// @brief Get Wav data ! /// This function copies the wav data into the buffer aImage. ! /// The buffer should be allocated according to the length of the wav data ! /// The size can be found by calling @ref GetWavDataLength(). ! void GetWavData(uint8_t* aData) const ! { ! return GetVarByRef(mDevice->wav_data.data, ! mDevice->wav_data.data+GetWavDataLength(), ! aData); ! }; ! ! /** @brief Get Seq data count */ ! uint GetSeqCount() const {return(GetVar(mDevice->seq_data.tones_count));}; ! /** @brief Get Sequence item */ ! player_audio_seq_item_t GetSeqItem(int aIndex) const {return(GetVar(mDevice->seq_data.tones[aIndex]));}; ! ! /** @brief Get Channel data count */ ! uint GetChannelCount() const {return(GetVar(mDevice->mixer_data.channels_count));}; ! /** @brief Get Sequence item */ ! player_audio_mixer_channel_t GetChannel(int aIndex) const {return(GetVar(mDevice->mixer_data.channels[aIndex]));}; ! ! ! ! /** @brief Command to play an audio block */ ! void PlayWav(player_audio_wav_t * aData); ! ! /** @brief Command to set recording state */ ! void SetWavStremRec(bool aState); ! ! /** @brief Command to play prestored sample */ ! void PlaySample(int aIndex); ! ! /** @brief Command to play sequence of tones */ ! void PlaySeq(player_audio_seq_t * aTones); ! ! /** @brief Command to set mixer levels */ ! void SetMixerLevels(player_audio_mixer_channel_list_t * aLevels); ! ! /** @brief Request to record a single audio block ! result is stored in wav_data */ ! void RecordWav(); ! ! /** @brief Request to load an audio sample */ ! void LoadSample(int aIndex, player_audio_wav_t * aData); ! ! /** @brief Request to retrieve an audio sample ! Data is stored in wav_data */ ! void GetSample(int aIndex); ! ! /** @brief Request to record new sample */ ! void RecordSample(int aIndex); ! ! /** @brief Request mixer channel data ! result is stored in mixer_data*/ ! void GetMixerLevels(); ! ! /** @brief Request mixer channel details list ! result is stored in channel_details_list*/ ! void GetMixerDetails(); ! ! }; // /** *************** *** 2194,2199 **** std::ostream& operator << (std::ostream& os, const PlayerCc::ActArrayProxy& c); std::ostream& operator << (std::ostream& os, const PlayerCc::AioProxy& c); ! //std::ostream& operator << (std::ostream& os, const PlayerCc::AudioDspProxy& c); ! //std::ostream& operator << (std::ostream& os, const PlayerCc::AudioMixerProxy& c); //std::ostream& operator << (std::ostream& os, const PlayerCc::BlinkenLightProxy& c); std::ostream& operator << (std::ostream& os, const PlayerCc::BlobfinderProxy& c); --- 2256,2260 ---- std::ostream& operator << (std::ostream& os, const PlayerCc::ActArrayProxy& c); std::ostream& operator << (std::ostream& os, const PlayerCc::AioProxy& c); ! std::ostream& operator << (std::ostream& os, const PlayerCc::AudioProxy& a); //std::ostream& operator << (std::ostream& os, const PlayerCc::BlinkenLightProxy& c); std::ostream& operator << (std::ostream& os, const PlayerCc::BlobfinderProxy& c); *************** *** 2220,2224 **** std::ostream& operator << (std::ostream& os, const PlayerCc::SimulationProxy& c); std::ostream& operator << (std::ostream& os, const PlayerCc::SonarProxy& c); - //std::ostream& operator << (std::ostream& os, const PlayerCc::SoundProxy& c); std::ostream& operator << (std::ostream& os, const PlayerCc::SpeechProxy& c); //std::ostream& operator << (std::ostream& os, const PlayerCc::SpeechRecognitionProxy& c); --- 2281,2284 ---- *************** *** 2227,2231 **** std::ostream& operator << (std::ostream& os, const PlayerCc::RFIDProxy& c); std::ostream& operator << (std::ostream& os, const PlayerCc::WSNProxy& c); - //std::ostream& operator << (std::ostream& os, const PlayerCc::TruthProxy& c); } --- 2287,2290 ---- Index: Makefile.am =================================================================== RCS file: /cvsroot/playerstage/code/player/client_libs/libplayerc++/Makefile.am,v retrieving revision 1.39 retrieving revision 1.40 diff -C2 -d -r1.39 -r1.40 *** Makefile.am 3 May 2006 13:06:44 -0000 1.39 --- Makefile.am 8 May 2006 12:39:07 -0000 1.40 *************** *** 31,34 **** --- 31,35 ---- actarrayproxy.cc \ aioproxy.cc \ + audioproxy.cc \ blobfinderproxy.cc \ bumperproxy.cc \ *************** *** 61,78 **** # not in libplayerc yet \ - aioproxy.cc \ - audioproxy.cc \ - audiodspproxy.cc \ - audiomixerproxy.cc \ blinkenlightproxy.cc \ energyproxy.cc \ mcomproxy.cc \ - motorproxy.cc \ - soundproxy.cc \ speechrecognitionproxy.cc \ - truthproxy.cc \ waveformproxy.cc - # motorproxy.cc #PLAYERCC_LIB_DIRS=-L${top_builddir}/libplayerxdr \ --- 62,71 ---- Index: audioproxy.cc =================================================================== RCS file: /cvsroot/playerstage/code/player/client_libs/libplayerc++/audioproxy.cc,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** audioproxy.cc 7 Oct 2005 15:49:30 -0000 1.2 --- audioproxy.cc 8 May 2006 12:39:07 -0000 1.3 *************** *** 24,83 **** * $Id$ * - * client-side blobfinder device */ #include "playerc++.h" ! void ! AudioProxy::FillData(player_msghdr_t hdr, const char *buffer) { ! if(hdr.size != sizeof(player_audio_data_t)) { ! if(player_debug_level(-1) >= 1) ! fprintf(stderr,"WARNING: AudioProxy expected %d bytes of " ! "audio data, but received %d. Unexpected results may " ! "ensue.\n", ! sizeof(player_audio_data_t),hdr.size); } ! frequency0 = ntohs(((player_audio_data_t*)buffer)->frequency0); ! amplitude0 = ntohs(((player_audio_data_t*)buffer)->amplitude0); ! frequency1 = ntohs(((player_audio_data_t*)buffer)->frequency1); ! amplitude1 = ntohs(((player_audio_data_t*)buffer)->amplitude1); ! frequency2 = ntohs(((player_audio_data_t*)buffer)->frequency2); ! amplitude2 = ntohs(((player_audio_data_t*)buffer)->amplitude2); ! frequency3 = ntohs(((player_audio_data_t*)buffer)->frequency3); ! amplitude3 = ntohs(((player_audio_data_t*)buffer)->amplitude3); ! frequency4 = ntohs(((player_audio_data_t*)buffer)->frequency4); ! amplitude4 = ntohs(((player_audio_data_t*)buffer)->amplitude4); } ! int ! AudioProxy::PlayTone(unsigned short freq, ! unsigned short amp, ! unsigned short dur) { ! player_audio_cmd_t cmd; ! cmd.frequency = htons(freq); ! cmd.amplitude = htons(amp); ! cmd.duration = htons(dur); ! return(client->Write(m_device_id, ! (const char*)&cmd,sizeof(cmd))); } ! // interface that all proxies SHOULD provide ! void ! AudioProxy::Print() { ! printf("#Audio(%d:%d) - %c\n", m_device_id.code, ! m_device_id.index, access); ! printf("(%6u,%6u) (%6u,%6u) (%6u,%6u) (%6u,%6u) (%6u,%6u)\n", ! frequency0,amplitude0, ! frequency1,amplitude1, ! frequency2,amplitude2, ! frequency3,amplitude3, ! frequency4,amplitude4); } --- 24,231 ---- * $Id$ * */ + #if HAVE_CONFIG_H + #include "config.h" + #endif + + #include <cassert> + #include <sstream> + #include <iomanip> + #include "playerc++.h" + #include "debug.h" ! using namespace PlayerCc; ! ! AudioProxy::AudioProxy(PlayerClient *aPc, uint aIndex) ! : ClientProxy(aPc, aIndex), ! mDevice(NULL) { ! Subscribe(aIndex); ! mInfo = &(mDevice->info); ! } ! ! AudioProxy::~AudioProxy() ! { ! Unsubscribe(); ! } ! ! void AudioProxy::Subscribe(uint aIndex) ! { ! scoped_lock_t lock(mPc->mMutex); ! mDevice = playerc_audio_create(mClient, aIndex); ! if (mDevice==NULL) ! throw PlayerError("AudioProxy::AudioProxy()", "could not create"); ! ! if (playerc_audio_subscribe(mDevice, PLAYER_OPEN_MODE) != 0) ! throw PlayerError("AudioProxy::AudioProxy()", "could not subscribe"); ! } ! ! void AudioProxy::Unsubscribe(void) ! { ! assert(mDevice!=NULL); ! scoped_lock_t lock(mPc->mMutex); ! playerc_audio_unsubscribe(mDevice); ! playerc_audio_destroy(mDevice); ! mDevice = NULL; ! } ! ! // interface that all proxies SHOULD provide ! std::ostream& std::operator << (std::ostream& os, const PlayerCc::AudioProxy& a) ! { ! player_audio_mixer_channel_detail_t channel_detail; ! player_audio_mixer_channel_t channel; ! ! int old_precision = os.precision(3); ! std::_Ios_Fmtflags old_flags = os.flags(); ! os.setf(std::ios::fixed); ! ! int NumChannelDetails = a.GetMixerDetailsCount(); ! int NumChannels = a.GetChannelCount(); ! int MinChan = NumChannels < NumChannelDetails ? NumChannels : NumChannelDetails; ! ! os << MinChan << " channels:" << std::endl; ! os << "Index\tValue\tState\tType\tName" << std::endl; ! for (int ii = 0; ii < MinChan; ii++) { ! channel_detail = a.GetMixerDetails(ii); ! channel = a.GetChannel(ii); ! os << ii << '\t' ! << channel.amplitude << '\t' ! << channel.active.state << '\t' ! << channel_detail.type << '\t' ! << channel_detail.name ! << std::endl; } ! os.precision(old_precision); ! os.flags(old_flags); ! ! return os; } ! ! ! ! /** @brief Command to play an audio block */ ! void AudioProxy::PlayWav(player_audio_wav_t * aData) { ! scoped_lock_t lock(mPc->mMutex); ! playerc_audio_wav_play_cmd(mDevice, aData); ! } ! /** @brief Command to set recording state */ ! void AudioProxy::SetWavStremRec(bool aState) ! { ! scoped_lock_t lock(mPc->mMutex); ! playerc_audio_wav_stream_rec_cmd(mDevice, aState); ! } ! /** @brief Command to play prestored sample */ ! void AudioProxy::PlaySample(int aIndex) ! { ! scoped_lock_t lock(mPc->mMutex); ! playerc_audio_sample_play_cmd(mDevice, aIndex); } ! /** @brief Command to play sequence of tones */ ! void AudioProxy::PlaySeq(player_audio_seq_t * aTones) { ! scoped_lock_t lock(mPc->mMutex); ! playerc_audio_seq_play_cmd(mDevice, aTones); ! } ! ! /** @brief Command to set mixer levels */ ! void AudioProxy::SetMixerLevels(player_audio_mixer_channel_list_t * aLevels) ! { ! scoped_lock_t lock(mPc->mMutex); ! playerc_audio_mixer_channel_cmd(mDevice, aLevels); ! } ! ! /** @brief Request to record a single audio block ! result is stored in wav_data */ ! void AudioProxy::RecordWav() ! { ! scoped_lock_t lock(mPc->mMutex); ! int ret = playerc_audio_wav_rec(mDevice); ! ! if (ret == -2) ! throw PlayerError("AudioProxy::RecordWav", "NACK", ret); ! else if (ret != 0) ! throw PlayerError("AudioProxy::RecordWav", ! playerc_error_str(), ! ret); ! } ! ! /** @brief Request to load an audio sample */ ! void AudioProxy::LoadSample(int aIndex, player_audio_wav_t * aData) ! { ! scoped_lock_t lock(mPc->mMutex); ! int ret = playerc_audio_sample_load(mDevice, aIndex, aData); ! ! if (ret == -2) ! throw PlayerError("AudioProxy::LoadSample", "NACK", ret); ! else if (ret != 0) ! throw PlayerError("AudioProxy::LoadSample", ! playerc_error_str(), ! ret); } + /** @brief Request to retrieve an audio sample + Data is stored in wav_data */ + void AudioProxy::GetSample(int aIndex) + { + scoped_lock_t lock(mPc->mMutex); + int ret = playerc_audio_sample_retrieve(mDevice, aIndex); + if (ret == -2) + throw PlayerError("AudioProxy::GetSample", "NACK", ret); + else if (ret != 0) + throw PlayerError("AudioProxy::GetSample", + playerc_error_str(), + ret); + } + + /** @brief Request to record new sample */ + void AudioProxy::RecordSample(int aIndex) + { + scoped_lock_t lock(mPc->mMutex); + int ret = playerc_audio_sample_rec(mDevice, aIndex); + + if (ret == -2) + throw PlayerError("AudioProxy::RecordSample", "NACK", ret); + else if (ret != 0) + throw PlayerError("AudioProxy::RecordSample", + playerc_error_str(), + ret); + } + + /** @brief Request mixer channel data + result is stored in mixer_data*/ + void AudioProxy::GetMixerLevels() + { + scoped_lock_t lock(mPc->mMutex); + int ret = playerc_audio_get_mixer_levels(mDevice); + + if (ret == -2) + throw PlayerError("AudioProxy::GetMixerLevels", "NACK", ret); + else if (ret != 0) + throw PlayerError("AudioProxy::GetMixerLevels", + playerc_error_str(), + ret); + } + + /** @brief Request mixer channel details list + result is stored in channel_details_list*/ + void AudioProxy::GetMixerDetails() + { + scoped_lock_t lock(mPc->mMutex); + int ret = playerc_audio_get_mixer_details(mDevice); + + if (ret == -2) + throw PlayerError("AudioProxy::GetMixerDetails", "NACK", ret); + else if (ret != 0) + throw PlayerError("AudioProxy::GetMixerDetails", + playerc_error_str(), + ret); + } |