helix-sp.h
来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C头文件 代码 · 共 374 行
H
374 行
/* * * This software is released under the provisions of the GPL version 2. * see file "COPYING". If that file is not available, the full statement * of the license can be found at * * http://www.fsf.org/licensing/licenses/gpl.txt * * Copyright (c) Paul Cifarelli 2005 * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. * * at this point, this class should be HelixNotSoSimplePlayer... */#ifndef _HELIX_SIMPLEPLAYER_LIB_H_INCLUDED_#define _HELIX_SIMPLEPLAYER_LIB_H_INCLUDED_class HSPClientAdviceSink;class HSPClientContext;class IHXErrorSinkControl;class HelixSimplePlayerAudioStreamInfoResponse;#include <limits.h>#include <sys/param.h>#include <pthread.h>#include <vector>#include <config.h>#include <iostream>using std::vector;#define MAX_PATH PATH_MAX#define MAX_PLAYERS 100 // that should do it...#define MAX_SCOPE_SAMPLES 5120class HelixSimplePlayer;class CHXURL;class IHXVolumeAdviseSink;class IHXAudioPlayer;class IHXAudioStream;class IHXAudioCrossFade;class IHXPlayer;class IHXPlayer2;class IHXErrorSink;class IHXErrorSinkControl;class IHXAudioPlayer;class IHXVolume;class IHXPlayerNavigator;class IHXClientEngineSelector;class IHXClientEngine;class IHXAudioHook;class IHXAudioStreamInfoResponse;class IHXCommonClassFactory;class IHXPluginEnumerator;class IHXPlugin2Handler;class IHXAudioDeviceManager;class IHXAudioHookManager;class IHXPreferences;class HSPAudioDevice;class IHXAudioDeviceResponse;#ifdef USE_HELIX_ALSAstruct _snd_mixer;struct _snd_mixer_elem;#endif// scope delay queueclass DelayQueue{public: DelayQueue() : fwd(0), len(0), time(0), etime(0), nchan(0), bps(0), allocd(false), buf(0) {} DelayQueue(int bufsize) : fwd(0), len(bufsize), time(0), etime(0), nchan(0), bps(0), allocd(true), buf(0) { buf = new unsigned char [ bufsize ]; } DelayQueue(DelayQueue &src) : fwd(0), len(src.len), time(src.time), etime(src.etime), nchan(src.nchan), bps(src.bps), allocd(true), buf(0) { buf = new unsigned char [ len ]; memcpy( (void *) buf, (void *) src.buf, src.len ); } ~DelayQueue() { if (allocd) delete [] buf; } struct DelayQueue *fwd; int len; // len of the buffer unsigned long time; // start time of the buffer unsigned long etime; // end time of the buffer int nchan; // number of channels int bps; // bytes per sample double tps; // time per sample int spb; // samples per buffer bool allocd; // did we allocate the memory? unsigned char *buf;};// simple list of supported mime typestruct MimeList{ MimeList(char *mimestr, char *ext) : mimetypes(0), mimeexts(0) { mimetypes = new char[strlen(mimestr)+1]; strcpy(mimetypes,mimestr); mimeexts = new char[strlen(ext)+1]; strcpy(mimeexts,ext); } ~MimeList() { delete [] mimetypes; delete [] mimeexts; } struct MimeList *fwd; char *mimetypes; char *mimeexts;};class HelixSimplePlayer{public: enum { ALL_PLAYERS = -1 }; HelixSimplePlayer(); virtual ~HelixSimplePlayer(); void init(const char *corelibpath, const char *pluginslibpath, const char *codecspath, int numPlayers = 1); void tearDown(); int initDirectSS(); int addPlayer(); // add another player void play(int playerIndex = ALL_PLAYERS, bool fadein = false, bool fadout = false, unsigned long fadetime = 0); // play the current url, waiting for it to finish void play(const char *url, int playerIndex = ALL_PLAYERS, bool fadein = false, bool fadeout = false, unsigned long fadetime = 0); // play the file, setting it as the current url; wait for it to finish int setURL(const char *url, int playerIndex = ALL_PLAYERS, bool islocal = true); // set the current url bool done(int playerIndex = ALL_PLAYERS); // test to see if the player(s) is(are) done void start(int playerIndex = ALL_PLAYERS, bool fadein = false, unsigned long fadetime = 0); // start the player void start(const char *file, int playerIndex = ALL_PLAYERS, bool fadein = false, unsigned long fadetime = 0); // start the player, setting the current url first void stop(int playerIndex = ALL_PLAYERS); // stop the player(s) void pause(int playerIndex = ALL_PLAYERS); // pause the player(s) void resume(int playerIndex = ALL_PLAYERS); // pause the player(s) void seek(unsigned long pos, int playerIndex = ALL_PLAYERS); // seek to the pos unsigned long where(int playerIndex) const; // where is the player in the playback unsigned long duration(int playerIndex) const; // how long (ms) is this clip? unsigned long getVolume(int playerIndex); // get the current volume void setVolume(unsigned long vol, int playerIndex = ALL_PLAYERS); // set the volume void setMute(bool mute, int playerIndex = ALL_PLAYERS); // set mute: mute = true to mute the volume, false to unmute bool getMute(int playerIndex); // get the mute state of the player void dispatch(); // dispatch the player(s) void cleanUpStream(int playerIndex); // cleanup after stream complete bool isPlaying(int playerIndex) const; // is the player currently playing? bool isLocal(int playerIndex) const; // playing a local file int numPlayers() const { return nNumPlayers; } // return the number of players virtual void onVolumeChange(int) {} // called when the volume is changed virtual void onMuteChange(int) {} // called when mute is changed virtual void onContacting(const char */*host*/) {} // called when contacting a host virtual void onBuffering(int /*percentage*/) {} // called when buffering int getError() const { return theErr; } static char* RemoveWrappingQuotes(char* str); //void setUsername(const char *username) { m_pszUsername = username; } //void setPassword(const char *password) { m_pszPassword = password; } //void setGUIDFile(const char *file) { m_pszGUIDFile = file; } bool ReadGUIDFile(); typedef struct { char title[512]; char artist[512]; unsigned long bitrate; } metaData;private: void DoEvent(); void DoEvents(int nTimeDelta); unsigned long GetTime(); char mCoreLibPath[MAXPATHLEN]; char mPluginLibPath[MAXPATHLEN]; int theErr; IHXErrorSink* pErrorSink; IHXErrorSinkControl* pErrorSinkControl; IHXClientEngineSelector* pCEselect; IHXCommonClassFactory* pCommonClassFactory; IHXPluginEnumerator* pPluginE; IHXPlugin2Handler* pPlugin2Handler; IHXAudioDeviceManager* pAudioDeviceManager; IHXAudioHookManager* pAudioHookManager; IHXAudioHook* pFinalAudioHook; HSPAudioDevice* pAudioDevice; struct playerCtrl { bool bPlaying; bool bStarting; bool bFadeIn; bool bFadeOut; unsigned long ulFadeLength; IHXAudioStream* pStream; HSPClientContext* pHSPContext; IHXPlayer* pPlayer; IHXPlayer2* pPlayer2; IHXAudioPlayer* pAudioPlayer; IHXAudioCrossFade* pCrossFader; IHXVolume* pVolume; IHXVolumeAdviseSink* pVolumeAdvise; IHXAudioStreamInfoResponse* pStreamInfoResponse; IHXAudioHook* pPreMixHook; IHXAudioHook* pPostMixHook; metaData md; char* pszURL; bool isLocal; unsigned short volume; bool ismute; // scope int scopecount; struct DelayQueue *scopebufhead; struct DelayQueue *scopebuftail; pthread_mutex_t m_scope_m; } **ppctrl; IHXAudioDeviceResponse *pAudioDeviceResponse; bool bURLFound; int nNumPlayers; int nNumPlayRepeats; int nTimeDelta; int nStopTime; bool bStopTime; void* core_handle; bool bStopping; int nPlay;public: const IHXAudioPlayer *getAudioPlayer(int playerIndex) const { return ppctrl[playerIndex]->pAudioPlayer; } const IHXAudioCrossFade *getCrossFader(int playerIndex) const { return ppctrl[playerIndex]->pCrossFader; } // crossfade void setFadeout(bool fadeout, unsigned long fadelength, int playerIndex = ALL_PLAYERS); // scope void addScopeBuf(struct DelayQueue *item, int playerIndex); DelayQueue *getScopeBuf(int playerIndex); int getScopeCount(int playerIndex) { return playerIndex >= 0 && playerIndex < nNumPlayers ? ppctrl[playerIndex]->scopecount : 0; } int peekScopeTime(unsigned long &t, int playerIndex); void clearScopeQ(int playerIndex = ALL_PLAYERS); // equalizer void enableEQ(bool enabled) { m_eq_enabled = enabled; } bool isEQenabled() { return m_eq_enabled; } void updateEQgains(); int numPlugins() const; int getPluginInfo(int index, const char *&description, const char *©right, const char *&moreinfourl) const; metaData *getMetaData(int playerIndex); const MimeList *getMimeList() const { return mimehead; } int getMimeListLen() const { return mimelistlen; }private: bool bEnableAdviceSink; bool bEnableVerboseMode; IHXClientEngine* pEngine; IHXPreferences* pEngineContext; char* m_pszUsername; char* m_pszPassword; char* m_pszGUIDFile; char* m_pszGUIDList; int m_Error; unsigned long m_ulNumSecondsPlayed; pthread_mutex_t m_engine_m; // supported mime type list MimeList *mimehead; int mimelistlen; // equalizer bool m_eq_enabled;public: // 0 = OSS // 1 = OldOSSsupport // 2 = ESound // 3 = Alsa // 4 = USound enum AUDIOAPI { OSS, OLDOSS, ESOUND, ALSA, USOUND }; void setOutputSink( AUDIOAPI out ); AUDIOAPI getOutputSink(); void setDevice( const char *dev ); const char *getDevice(); void setAlsaCapableCore() { m_AlsaCapableCore = true; } virtual int fallbackToOSS() { return 0; } int m_preamp; vector<int> m_equalizerGains;private: AUDIOAPI m_outputsink; char *m_device; // work around the annoying problem of the core reseting the PCM volume on every url changeprotected: void openAudioDevice(); void closeAudioDevice();#ifdef USE_HELIX_ALSA int getDirectMasterVolume(); void setDirectMasterVolume(int vol);#endif int getDirectPCMVolume(); void setDirectPCMVolume(int vol);private: AUDIOAPI m_direct; bool m_AlsaCapableCore; int m_nDevID;#ifdef USE_HELIX_ALSA struct _snd_mixer* m_pAlsaMixerHandle; struct _snd_mixer_elem* m_pAlsaMasterMixerElem; struct _snd_mixer_elem* m_pAlsaPCMMixerElem;#endif char *m_alsaDevice; bool m_urlchanged; int m_volBefore; int m_volAtStart;#ifdef USE_HELIX_ALSA int m_MvolBefore; int m_MvolAtStart;#endif int m_numPlugins; struct pluginInfo { char *description; char *copyright; char *moreinfourl; } **m_pluginInfo;protected: virtual int print2stdout(const char *fmt, ...)#ifdef __GNUC__ __attribute__ ((format (printf, 2, 3)))#endif ; virtual int print2stderr(const char *fmt, ...)#ifdef __GNUC__ __attribute__ ((format (printf, 2, 3)))#endif ; virtual void notifyUser(unsigned long/*code*/, const char */*moreinfo*/, const char */*moreinfourl*/) {} virtual void interruptUser(unsigned long/*code*/, const char */*moreinfo*/, const char */*moreinfourl*/) {} friend class HSPClientAdviceSink; friend class HSPErrorSink; friend class HSPAuthenticationManager; friend class HelixSimplePlayerAudioStreamInfoResponse; friend class HSPPreMixAudioHook; friend class HSPPostProcessor; friend class HSPPostMixAudioHook; friend class HSPFinalAudioHook; friend class HelixSimplePlayerVolumeAdvice; friend class HSPEngineContext; friend class HSPAudioDevice;};#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?