亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hspalsadevice.cpp

?? Amarok是一款在LINUX或其他類UNIX操作系統中運行的音頻播放器軟件。 經過兩年開發后
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
/****************************************************************************** *                                                                            * *   This program is free software; you can redistribute it and/or modify     * *   it under the terms of the GNU General Public License as published by     * *   the Free Software Foundation; either version 2 of the License, or        * *   (at your option) any later version.                                      * *                                                                            * *   This library is distributed in the hope that it will be useful, but      * *   WITHOUT ANY WARRANTY; without even the implied warranty of               * *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU        * *   Lesser General Public License for more details.                          * *                                                                            * *   You should have received a copy of the GNU Lesser General Public         * *   License along with this library; if not, write to the Free Software      * *   Foundation, Inc., 51 Franklin St, 5th fl, Boston, MA 02110-1301,         * *   USA, or check http://www.fsf.org/about/contact.html                      * *                                                                            * *   Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. * *   Portions Copyright (c) 2005 Paul Cifarelli                               * *                                                                            * ******************************************************************************/#include <unistd.h>#include <fcntl.h>#include <stdlib.h>#include <errno.h>#include <sys/ioctl.h>#include <stdio.h> #include <math.h>#include <time.h>#include <sys/time.h>#include <unistd.h>#include <config.h>#include "hxcomm.h"#include "hxcore.h"#include "hxprefs.h"#include "hxstrutl.h"#include "hxvsrc.h"#include "hxresult.h"#include "hxausvc.h"#include "helix-sp.h"#include "ihxpckts.h"#include "hxprefs.h"#include "hspalsadevice.h"#ifdef HX_LOG_SUBSYSTEM#include "hxtlogutil.h"#include "ihxtlogsystem.h"#endif#include "dllpath.h"#include "hxbuffer.h"#ifdef USE_HELIX_ALSAIHXPreferences* z_pIHXPrefs = 0;#define RA_AOE_NOERR         0#define RA_AOE_GENERAL      -1#define RA_AOE_DEVNOTOPEN   -2#define RA_AOE_NOTENABLED   -3#define RA_AOE_BADFORMAT    -4#define RA_AOE_NOTSUPPORTED -5#define RA_AOE_DEVBUSY      -6#define RA_AOE_BADOPEN      -7#ifdef __FreeBSD__#define PTHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_NORMAL#endif#if !defined(__NetBSD__) && !defined(__OpenBSD__)	#include <sys/soundcard.h>#else	#include <soundcard.h>#endiftypedef HX_RESULT (HXEXPORT_PTR FPRMSETDLLACCESSPATH) (const char*);AudioQueue::AudioQueue( const HXAudioData *buf) : fwd(0){   ad = *buf;   ad.pData->AddRef();}AudioQueue::~AudioQueue(){   ad.pData->Release();}STDMETHODIMPHSPAudioDevice::QueryInterface(REFIID riid, void**ppvObj){    if(IsEqualIID(riid, IID_IUnknown))    {        AddRef();        *ppvObj = (IUnknown*)(IHXAudioDevice *)this;        return HXR_OK;    }    else if(IsEqualIID(riid, IID_IHXAudioDevice))    {        AddRef();        *ppvObj = (IHXAudioDevice *)this;        return HXR_OK;    }    *ppvObj = NULL;    return HXR_NOINTERFACE;}STDMETHODIMP_(UINT32)HSPAudioDevice::AddRef(){    return InterlockedIncrement(&m_lRefCount);}STDMETHODIMP_(UINT32)HSPAudioDevice::Release(){    if (InterlockedDecrement(&m_lRefCount) > 0)    {        return m_lRefCount;    }    delete this;    return 0;}STDMETHODIMPHSPAudioDevice::CheckFormat( const HXAudioFormat* pAudioFormat ){   m_Player->print2stderr("########## Got to HSPAudioDevice::CheckFormat\n");   return (_CheckFormat(pAudioFormat));}STDMETHODIMPHSPAudioDevice::Close( const BOOL bFlush ){   m_Player->print2stderr("########## Got to HSPAudioDevice::Close flush %d\n", bFlush);   pthread_mutex_lock(&m_m);   if (bFlush)   {      clearQueue();      _Drain();   }   _Reset();   _CloseAudio();   _CloseMixer();   m_closed = true;   m_ulCurrentTime = m_ulQTime = 0;   if (m_pStreamResponse)      m_pStreamResponse->Release();      pthread_mutex_unlock(&m_m);      return 0;} STDMETHODIMPHSPAudioDevice::Drain(){   m_Player->print2stderr("########## Got to HSPAudioDevice::Drain\n");   pthread_mutex_lock(&m_m);   LONG32 err = _Drain();   clearQueue();   pthread_mutex_unlock(&m_m);   return err;}STDMETHODIMPHSPAudioDevice::GetCurrentAudioTime( REF(ULONG32) ulCurrentTime ){   //m_Player->print2stderr("########## Got to HSPAudioDevice::GetCurrentTime = %d\n", m_ulCurrentTime);   int err = 0;   snd_pcm_sframes_t frame_delay = 0;   pthread_mutex_lock(&m_m);   if (!m_closed)   {      err = snd_pcm_delay (m_pAlsaPCMHandle, &frame_delay);      if (err < 0)      {#ifdef HX_LOG_SUBSYSTEM         HXLOGL1 ( HXLOG_ADEV, "snd_pcm_status: %s", snd_strerror(err));        #endif         m_Player->print2stderr("########## HSPAudioDevice::GetCurrentAudioTime error getting frame_delay: %s\n", snd_strerror(err));         pthread_mutex_unlock(&m_m);         return -1;      }      ulCurrentTime = m_ulCurrentTime - (ULONG32)(((double)frame_delay * 1000.0) / (double)m_unSampleRate);      //m_Player->print2stderr("########## HSPAudioDevice::GetCurrentAudioTime %d %d\n", ulCurrentTime, m_ulCurrentTime);   }   pthread_mutex_unlock(&m_m);   return 0;}STDMETHODIMP_(UINT16)HSPAudioDevice::GetVolume(){   m_Player->print2stderr("########## Got to HSPAudioDevice::GetVolume\n");   return 0;}STDMETHODIMP_(BOOL)   HSPAudioDevice::InitVolume(const UINT16 /*uMinVolume*/, const UINT16 /*uMaxVolume*/){   m_Player->print2stderr("########## Got to HSPAudioDevice::InitVolume\n");   return true;}STDMETHODIMPHSPAudioDevice::Open(const HXAudioFormat* pAudioFormat, IHXAudioDeviceResponse* pStreamResponse){   int err;   m_Player->print2stderr("########## Got to HSPAudioDevice::Open\n");   if (pStreamResponse)      pStreamResponse->AddRef();   pthread_mutex_lock(&m_m);     m_drain = false;   m_closed = false;   m_ulTotalWritten = 0;   m_ulCurrentTime = 0;   m_SWPause = false;   m_pStreamResponse = pStreamResponse;   if (!m_pAlsaPCMHandle)   {      err = _OpenAudio();      if (err) m_Player->print2stderr("########## HSPAudioDevice::Open error (device) %d\n", err);      err = SetDeviceConfig(pAudioFormat);      if (err) m_Player->print2stderr("########## HSPAudioDevice::Open error (config) %d\n", err);      m_ulCurrentTime = m_ulLastTime = m_ulQTime = 0;   }    if (m_pAlsaMixerHandle != NULL)    {       err = _OpenMixer();       if (err) m_Player->print2stderr("########## HSPAudioDevice::Open error (mixer) %d\n", err);    }   pthread_mutex_unlock(&m_m);   return 0;}STDMETHODIMPHSPAudioDevice::Pause(){   m_Player->print2stderr("########## Got to HSPAudioDevice::Pause %d\n", m_bHasHardwarePauseAndResume);   _Pause();   return 0;}STDMETHODIMPHSPAudioDevice::Reset(){   m_Player->print2stderr("########## Got to HSPAudioDevice::Reset\n");   return (_Reset());}STDMETHODIMPHSPAudioDevice::Resume(){   m_Player->print2stderr("########## Got to HSPAudioDevice::Resume\n");   _Resume();   return 0;}STDMETHODIMPHSPAudioDevice::SetVolume( const UINT16 /*uVolume*/ ){   m_Player->print2stderr("########## Got to HSPAudioDevice::SetVolume\n");   return 0;}STDMETHODIMPHSPAudioDevice::Write( const HXAudioData* pAudioData ){   addBuf( new AudioQueue( pAudioData ) );   return 0;}int HSPAudioDevice::sync(){   if (m_pStreamResponse)   {      ULONG32 curtime;      if (!GetCurrentAudioTime(curtime) && curtime)         return m_pStreamResponse->OnTimeSync(curtime);      else      {         // probably a seek occurred         //clearQueue();         _Reset();      }   }   return -1;}HX_RESULT HSPAudioDevice::OnTimeSync(){   HX_RESULT err;   if (!(err = sync()))      return HXR_OK;   return err;}intHSPAudioDevice::_Write( const HXAudioData* pAudioData ){   unsigned long len;   long bytes;   unsigned char *data;   int err = 0;      pAudioData->pData->Get(data, len);   // if the time of this buf is earlier than the last, or the time between this buf and the last is > 1 buffer's worth, this was a seek   if ( pAudioData->ulAudioTime < m_ulCurrentTime ||        pAudioData->ulAudioTime - m_ulCurrentTime > (1000 * len) / (m_unNumChannels * m_unSampleRate) + 1 )    {      m_Player->print2stderr("########## seek detected %ld %ld, len = %ld %d\n", m_ulCurrentTime, pAudioData->ulAudioTime, len,                             abs(pAudioData->ulAudioTime - (m_ulCurrentTime + (1000 * len) / (m_unNumChannels * m_unSampleRate))));      //_Reset();      //clearQueue();   }   if (!err)   {      err = WriteBytes(data, len, bytes);      m_ulCurrentTime = pAudioData->ulAudioTime;   }   err = sync();   //m_Player->print2stderr("########## %d %d\n", m_ulCurrentTime,pAudioData->ulAudioTime);   //m_Player->print2stderr("########## Got to HSPAudioDevice::Write len=%d  byteswriten=%d err=%d time=%d\n",   //                       len,bytes,err,m_ulCurrentTime);   return err;}//------------------------------------------// Ctors and Dtors.//------------------------------------------HSPAudioDevice::HSPAudioDevice(HelixSimplePlayer *player, const char *device) :    m_pAlsaPCMHandle (NULL),    m_pAlsaMixerHandle (NULL),    m_pAlsaMixerElem (NULL),    m_pPCMDeviceName (NULL),    m_pMixerDeviceName (NULL),    m_pMixerElementName (NULL),    m_bHasHardwarePauseAndResume (FALSE),    m_nBytesPlayedBeforeLastTrigger(0),    m_nLastBytesPlayed(0),    m_bGotInitialTrigger(FALSE),    m_bUseMMAPTStamps(TRUE),    m_lRefCount(0),    m_wLastError(0),    m_SWPause(false),    m_Player(player),    m_done(false),    m_drain(false),    m_closed(true),    m_head(0),    m_tail(0){   pthread_mutexattr_t ma;   pthread_mutexattr_init(&ma);   pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_FAST_NP); // note this is not portable outside linux and a few others   pthread_mutex_init(&m_m, &ma);   pthread_cond_init(&m_cv, NULL);   // create thread that will wait for buffers to appear to send to the device   pthread_create(&m_thrid, 0, writerThread, this);   if (device)   {      int len = strlen( device );      m_Player->pCommonClassFactory->CreateInstance(CLSID_IHXBuffer, (void **) &m_pPCMDeviceName);      if (m_pPCMDeviceName)         m_pPCMDeviceName->Set( (const unsigned char*) device, len + 1 );   }}HSPAudioDevice::~HSPAudioDevice(){   pthread_mutex_lock(&m_m);   m_done = true;   pthread_mutex_unlock(&m_m);       pthread_cond_signal(&m_cv);   void *tmp;   pthread_join(m_thrid, &tmp);      if(m_pPCMDeviceName)   {      HX_RELEASE(m_pPCMDeviceName);   }      if(m_pMixerDeviceName)   {      HX_RELEASE(m_pMixerDeviceName);   }      if(m_pMixerElementName)   {      HX_RELEASE(m_pMixerElementName);   }      pthread_cond_destroy(&m_cv);   pthread_mutex_destroy(&m_m);}void HSPAudioDevice::addBuf(struct AudioQueue *item){   pthread_mutex_lock(&m_m);   m_ulQTime = item->ad.ulAudioTime;   if (m_tail)   {      item->fwd = 0;      m_tail->fwd = item;      m_tail = item;   }   else   {      item->fwd = 0;      m_head = item;      m_tail = item;   }   pthread_mutex_unlock(&m_m);   pthread_cond_signal(&m_cv);}AudioQueue *HSPAudioDevice::getBuf(){   pthread_mutex_lock(&m_m);      AudioQueue *item = m_head;      if (item)   {      m_head = item->fwd;      if (!m_head)         m_tail = 0;   }      pthread_mutex_unlock(&m_m);         return item;}// NOTE THAT THIS IS NOT UNDER LOCK, AND SHOULD ONLY BE CALLED WITH THE MUTEX LOCKEDvoid HSPAudioDevice::clearQueue(){   AudioQueue *item;   if (!m_tail)      return;   while (m_tail)   {      item = m_head;      m_head = item->fwd;      if (!m_head)         m_tail = 0;      delete item;   } }void *HSPAudioDevice::writerThread( void *arg ){   HSPAudioDevice *thisObj = (HSPAudioDevice *) arg;   AudioQueue *item;   pthread_mutex_lock(&thisObj->m_m);   while (!thisObj->m_done)   {      pthread_mutex_unlock(&thisObj->m_m);      item = thisObj->getBuf();      if (item)         thisObj->_Write(&item->ad);      delete item;      pthread_mutex_lock(&thisObj->m_m);      if (!thisObj->m_tail)         pthread_cond_wait(&thisObj->m_cv, &thisObj->m_m);   }   pthread_mutex_unlock(&thisObj->m_m);   thisObj->m_Player->print2stderr("############ writerThread exit\n");   return 0;}// These Device Specific methods must be implemented// by the platform specific sub-classes.INT16 HSPAudioDevice::GetAudioFd(void){    //Not implemented.    return -1;}//Device specific methods to open/close the mixer and audio devices.HX_RESULT HSPAudioDevice::_OpenAudio(){    int err = 0;    const char* szDevice;    HX_ASSERT (m_pAlsaPCMHandle == NULL);    if (m_pAlsaPCMHandle)    {        m_wLastError = RA_AOE_BADOPEN;        return m_wLastError;    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
偷拍亚洲欧洲综合| 日韩三级中文字幕| 国产精品传媒在线| 成人午夜av在线| 欧美韩日一区二区三区四区| 国产精品99久久久久久久女警| 国产午夜精品一区二区三区四区| 国产麻豆成人精品| 欧美激情中文不卡| 日韩一级欧美一级| 日本电影欧美片| 秋霞国产午夜精品免费视频| 精品免费一区二区三区| 国产福利一区二区三区视频| 日韩理论片一区二区| 欧美另类变人与禽xxxxx| 久久精品999| 国产精品伦理一区二区| 欧美日免费三级在线| 欧美a一区二区| 亚洲国产精品天堂| 久久毛片高清国产| 一本一本大道香蕉久在线精品| 亚洲国产视频直播| 亚洲欧美日韩国产综合在线| 91精品在线观看入口| 成人在线一区二区三区| 精彩视频一区二区| 亚洲午夜影视影院在线观看| 国产精品电影院| 国产精品狼人久久影院观看方式| 26uuu国产日韩综合| 色av一区二区| 91亚洲国产成人精品一区二三| 日韩国产精品大片| 成人免费在线播放视频| 91精品婷婷国产综合久久竹菊| 在线观看三级视频欧美| 国产91精品久久久久久久网曝门| 午夜国产精品影院在线观看| 一区二区免费视频| 日本一区二区三区国色天香| 在线成人免费视频| 欧美精品xxxxbbbb| 91麻豆精品国产91久久久| 欧美电影一区二区| 91精品久久久久久久99蜜桃| 欧美一区二区三区啪啪| 91亚洲精品久久久蜜桃| 91视频一区二区三区| 色综合久久中文字幕综合网| 色久优优欧美色久优优| 91久久精品午夜一区二区| av欧美精品.com| 国产成人午夜精品5599| 福利电影一区二区三区| 99久久国产综合色|国产精品| 国产美女视频91| 成av人片一区二区| 国内偷窥港台综合视频在线播放| 五月天亚洲婷婷| 奇米亚洲午夜久久精品| 国产一区二区网址| 99久久国产综合色|国产精品| 91电影在线观看| 91精选在线观看| 国产色婷婷亚洲99精品小说| 中文字幕亚洲电影| 午夜影院在线观看欧美| 夜夜爽夜夜爽精品视频| 亚洲国产精品久久人人爱| 美腿丝袜亚洲综合| 日韩精品电影一区亚洲| 午夜av区久久| 国产精品一区免费视频| 色婷婷久久久综合中文字幕| 欧美色男人天堂| 日韩欧美国产一区二区三区| 91精品国产综合久久精品| 精品久久人人做人人爰| 国产精品视频一二| 午夜影院久久久| 高清不卡一二三区| 精品视频一区三区九区| 久久亚洲综合av| 亚洲在线中文字幕| 久久国产剧场电影| 国产69精品久久久久毛片| 欧美综合色免费| 国产精品三级久久久久三级| 一区二区三区在线视频观看58| 亚洲综合视频在线观看| 国产老肥熟一区二区三区| 91精彩视频在线观看| 久久中文字幕电影| 亚洲丝袜自拍清纯另类| 狠狠久久亚洲欧美| 欧美三级日本三级少妇99| 中文字幕成人在线观看| 麻豆国产欧美一区二区三区| 91传媒视频在线播放| 欧美激情一区二区三区不卡 | 色综合天天综合网国产成人综合天| 国产亚洲欧美一级| 亚洲国产精品一区二区尤物区| 国产福利一区二区| 日韩免费福利电影在线观看| 一区二区三区欧美在线观看| 成人一区二区三区视频在线观看| 色偷偷久久人人79超碰人人澡| 日产精品久久久久久久性色| 亚洲一区二区免费视频| 成人激情黄色小说| wwww国产精品欧美| 日韩av中文在线观看| 欧美色网一区二区| 91精品国产综合久久久久久漫画| 亚洲三级视频在线观看| 国产乱码精品一区二区三区忘忧草| 欧美一区国产二区| 亚洲精品日日夜夜| 蜜臀av一区二区在线免费观看 | 一区二区三区日韩精品| 成人免费毛片app| 久久久久久97三级| 国产一区二区中文字幕| 欧美一区二区大片| 肉色丝袜一区二区| 欧美日韩色综合| 亚洲成年人影院| 欧美视频在线播放| 亚洲va天堂va国产va久| 欧美色欧美亚洲另类二区| 亚洲第四色夜色| 欧美美女bb生活片| 日韩国产在线一| 欧美一区二区私人影院日本| 视频一区视频二区在线观看| 欧美日韩欧美一区二区| 亚洲bt欧美bt精品777| 欧美日韩在线不卡| 亚洲aaa精品| 欧美一级日韩一级| 韩日av一区二区| 国产亚洲精品福利| 成人av网址在线| 一区二区三区在线观看视频 | 日日夜夜精品视频免费| 国产精品卡一卡二| 国产精品色眯眯| 日韩成人av影视| 日韩免费电影网站| 国产精品911| 国产精品乱人伦中文| 色成人在线视频| 日本不卡一区二区三区高清视频| 欧美一卡2卡3卡4卡| 国产乱淫av一区二区三区| 国产精品久久久久一区二区三区 | 亚洲天堂中文字幕| 在线欧美日韩精品| 首页亚洲欧美制服丝腿| 精品99一区二区| 夜夜爽夜夜爽精品视频| 在线播放欧美女士性生活| 久久99精品国产.久久久久 | 国产精品免费免费| 欧美性大战久久久| 国产精品九色蝌蚪自拍| 国内精品国产成人国产三级粉色| 久久女同精品一区二区| 波多野结衣中文字幕一区| 亚洲国产一区二区视频| 久久综合中文字幕| 91啪亚洲精品| 久久精品国产成人一区二区三区| 亚洲国产高清在线观看视频| 欧美综合久久久| 精品午夜久久福利影院| 亚洲免费观看视频| 精品精品国产高清一毛片一天堂| 91伊人久久大香线蕉| 另类小说色综合网站| 亚洲视频免费在线| 日韩一级大片在线观看| 色综合 综合色| 九九国产精品视频| 亚洲午夜免费视频| 中文在线资源观看网站视频免费不卡| 欧美三级电影网站| 成人精品视频一区二区三区尤物| 五月婷婷欧美视频| 国产精品久久久久桃色tv| 91麻豆精品国产无毒不卡在线观看| 成人高清免费观看| 久久国产剧场电影| 亚洲成人动漫av| 亚洲女爱视频在线| 久久九九全国免费| 欧美草草影院在线视频|