• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C++ ov_pcm_seek函数代码示例

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

本文整理汇总了C++中ov_pcm_seek函数的典型用法代码示例。如果您正苦于以下问题:C++ ov_pcm_seek函数的具体用法?C++ ov_pcm_seek怎么用?C++ ov_pcm_seek使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。



在下文中一共展示了ov_pcm_seek函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。

示例1: while

// Write sample data into the supplied PCM sample buffers
void CWinGlkOGGSound::WriteSampleData(unsigned char* pSample, int iSampleLen)
{
  int iStream, iCurrent = 0;
  while (iCurrent < iSampleLen)
  {
    long lRead =
      ov_read(&m_Stream,(char*)(pSample+iCurrent),(iSampleLen-iCurrent),0,2,1,&iStream);
    if (lRead > 0)
      iCurrent += lRead;
    else
    {
      if (m_iRepeat > 0)
      {
        ov_pcm_seek(&m_Stream,0);
        m_iRepeat--;
      }
      else if (m_iRepeat == -1)
        ov_pcm_seek(&m_Stream,0);
      else
      {
        while (iCurrent < iSampleLen)
          pSample[iCurrent++] = 0;
      }
    }
  }
}
开发者ID:DavidKinder,项目名称:Windows-Glk,代码行数:27,代码来源:GlkSoundOGG.cpp


示例2: OGGDATA

 unsigned long OggDecoder::Render( unsigned long size, void *buf )
 {
     OggDecoderData *data = OGGDATA(this);
     
     if (!data){
         outOfData = true;
         return 0;
     }
     
     int ret = 1;
     unsigned long pos=0;
     
     if (seekOffset != -1)
     {
         long seek = (long)(((float)seekOffset/1000.0f) * (float)samplerate);
         ov_pcm_seek(&data->vf, seek);
         seekOffset = -1;
         outOfData = false;
     }
     
     while(ret && pos<size)
     {
         ret = ov_read(&data->vf, (char*)buf+pos, size-pos, 0, 2, 1, &data->sec);
         pos += ret;
     }
     
     // reached the end?
     if (!ret && (loopsRemaining!=0))
     {
         // we are looping so restart from the beginning
         ret = 1;
         ov_pcm_seek(&data->vf, 0);  // Loop back position, TODO: If we want to loop to a specific point, here is the code for that!
         while(ret && pos<size)
         {
             ret = ov_read(&data->vf, (char*)buf+pos, size-pos, 0, 2, 1, &data->sec);
             pos += ret;
         }
         
         // Decrease from Loops Remaining (don't touch the -1 infinite loop stuff)
         if (loopsRemaining > 0)
             loopsRemaining--;
     }
     else if (!ret && (loopsRemaining==0)){
         outOfData = true;
     }
     
     return pos;
 }
开发者ID:amackworth,项目名称:Monocle-Engine,代码行数:48,代码来源:OggDecoder.cpp


示例3: ov_pcm_seek

void
SoundD3D::RewindOggStream()
{
	if (!ov_file || !buffer)
	return;

	// rewind the stream and keep going...
	eos_written = false;
	eos_latch   = 0;
	read_size   = wfex.nAvgBytesPerSec / 2;

	// set the stream pointer back to the beginning:
	ov_pcm_seek(ov_file, 0);

	// find the size of the file:
	stream_left    = (DWORD) ov_pcm_total(ov_file,-1);
	stream_offset  = 0;

	total_time     = (double) stream_left /
	(double) wfex.nAvgBytesPerSec;

	if (stream_left < read_size) {
		status = DONE;
		buffer->Stop();
	}
}
开发者ID:lightgemini78,项目名称:Starshatter-Rearmed,代码行数:26,代码来源:SoundD3D.cpp


示例4: while

    int OggStream::decodeNextBlock(bool looped, void* data, int bufferSize)
    {
        unsigned int bytesUnpacked = 0;

        int p = (int)ov_pcm_tell(&_vorbisFile);

        while (1)
        {
            int r = (int)ov_read(&_vorbisFile, (char*)data, bufferSize, &_section);
            if (!r)
            {
                if (looped)
                {
                    ov_pcm_seek(&_vorbisFile, 0);

                }
                else
                {
                    _streamEnded = true;
                    break;
                }
            }

            data = (char*)data + r;
            bufferSize -= r;

            bytesUnpacked += r;
            if (bufferSize == 0)
                break;
        }

        p = int(ov_pcm_tell(&_vorbisFile)) - p;

        return bytesUnpacked;
    }
开发者ID:Aizter,项目名称:oxygine-sound,代码行数:35,代码来源:OggStream.cpp


示例5: while

	bool SPOggFile::NextStreamData( BYTE* pData, DWORD length, DWORD &readBytes, bool &eof )
	{
		if (!isLoaded)
		{
			return false;
		}

		DWORD pos = 0;
		int sec = 0;
		int ret = 1;

		while(ret && pos < length)
		{
			ret = ov_read(&vf, (char*)pData + pos, length - pos, 0, 2, 1, &sec);
			pos += ret;
		}

		readBytes = pos;

		if (!ret)
		{
			eof = true;
			ov_pcm_seek(&vf, 0);
		}
		else
		{
			eof = false;
		}

		return true;
	}
开发者ID:weimingtom,项目名称:spengine-1,代码行数:31,代码来源:SPOggFile.cpp


示例6: ov_pcm_seek

bool RealSoundOgg::ServiceBuffer()
{
	if( m_bMute ) return true;
	if (m_pDSB == NULL) return false;

	DWORD pos = 0;
	m_pDSB->GetCurrentPosition(&pos, NULL);
	m_nCurSection = ((int)pos < m_nBufSize) ? 0:1;

	if (m_nCurSection != m_nLastSection)
	{
		if (m_bDone && !m_bLoop) 
		{
			if (m_bOpened)
			{
				if (m_bPlaying)
				{
					ov_pcm_seek(&m_vf, 0);
					m_pDSB->Stop();
					m_bPlaying = false;
				}
			}

			return false;
		}
		if (m_bAlmostDone && !m_bLoop) m_bDone = true;

		WriteStream(m_nBufSize);
	}

	return true;
}
开发者ID:MagistrAVSH,项目名称:node3d,代码行数:32,代码来源:RealSoundOgg.cpp


示例7: ov_pcm_seek

	void OGG_Source::rewind()
	{
		if (this->streamOpen)
		{
			ov_pcm_seek(&this->oggStream, 0);
		}
	}
开发者ID:Ioleynikov,项目名称:libxal,代码行数:7,代码来源:OGG_Source.cpp


示例8: ov_info

	bool OGG_Source::open()
	{
		Source::open();
		if (!this->streamOpen)
		{
			return false;
		}
		// setting the special callbacks
		ov_callbacks callbacks;
		callbacks.read_func = &_dataRead;
		callbacks.seek_func = &_dataSeek;
		callbacks.close_func = &_dataClose; // may not be NULL because it may crash on Android otherwise
		callbacks.tell_func = &_dataTell;
		if (ov_open_callbacks((void*)this->stream, &this->oggStream, NULL, 0, callbacks) == 0)
		{
			vorbis_info* info = ov_info(&this->oggStream, -1);
			this->channels = (int)info->channels;
			this->samplingRate = (int)info->rate;
			this->bitsPerSample = 16; // always 16 bit data
			int logicalSamples = (int)ov_pcm_total(&this->oggStream, -1);
			this->size = logicalSamples * this->channels * this->bitsPerSample / 8;
			this->duration = (float)logicalSamples / this->samplingRate;
			ov_pcm_seek(&this->oggStream, 0); // make sure the PCM stream is at the beginning to avoid nasty surprises
		}
		else
		{
			hlog::error(logTag, "OGG: error reading data!");
			this->close();
		}
		return this->streamOpen;
	}
开发者ID:Ioleynikov,项目名称:libxal,代码行数:31,代码来源:OGG_Source.cpp


示例9: Stop

bool C4MusicFileOgg::Play(bool loop)
{
	// Valid file?
	if (!loaded) return false;
	// stop previous
	Stop();
	// Get channel to use
	alGenSources(1, (ALuint*)&channel);
	if (!channel) return false;

	playing = true;
	streaming_done = false;
	this->loop = loop;
	byte_pos_total = 0;

	// initial volume setting
	SetVolume(float(::Config.Sound.MusicVolume) / 100.0f);

	// prepare read
	ogg_info.sound_data.resize(num_buffers * buffer_size);
	alGenBuffers(num_buffers, buffers);
	ov_pcm_seek(&ogg_file, 0);

	// Fill initial buffers
	for (size_t i=0; i<num_buffers; ++i)
		if (!FillBuffer(i)) break; // if this fails, the piece is shorter than the initial buffers

	// play!
	alErrorCheck(alSourcePlay(channel));
	
	return true;
}
开发者ID:Meowtimer,项目名称:openclonk,代码行数:32,代码来源:C4MusicFile.cpp


示例10: qDebug

long SoundSourceOggVorbis::seek(long filepos)
{
    // In our speak, filepos is a sample in the file abstraction (i.e. it's
    // stereo no matter what). filepos/2 is the frame we want to seek to.
    if (filepos % 2 != 0) {
        qDebug() << "SoundSourceOggVorbis got non-even seek target.";
        filepos--;
    }

    if (ov_seekable(&vf)) {
        if (ov_pcm_seek(&vf, filepos/2) != 0) {
            // This is totally common (i.e. you're at EOF). Let's not leave this
            // qDebug on.

            // qDebug() << "ogg vorbis: Seek ERR on seekable.";
        }

        // Even if an error occured, return them the current position because
        // that's what we promised. (Double it because ov_pcm_tell returns
        // frames and we pretend to the world that everything is stereo)
        return ov_pcm_tell(&vf) * 2;
    } else {
        qDebug() << "ogg vorbis: Seek ERR at file " << getFilename();
        return 0;
    }
}
开发者ID:calabrhoouse,项目名称:mixxx,代码行数:26,代码来源:soundsourceoggvorbis.cpp


示例11: requestSize

	//-------------------------------------------------------------------------------------------------------
	//
	std::shared_ptr<char> ogg_reader::read(size_t bufferSize, uint64_t *readBytes) {
		char* buffer = new char[bufferSize];
		int requestSize(bufferSize);
		int bitStream(0);
		long readSize(0);
		uint32_t comSize(0);
		while (true) {
			readSize = ov_read(&vorbisFile_, buffer + comSize, requestSize, 0, 2, 1, &bitStream);
			// 曲が終わってた
			if (!readSize) {
				ov_pcm_seek(&vorbisFile_, 0);
				break;
			}

			// 書き込んだサイズを加える
			comSize += readSize;
			
			// 波形データ配列の次の書き込み位置がバッファサイズを超えてたらループを抜ける
			if (comSize >= bufferSize) {
				break;
			}
			// バッファを全部書き込んでなかったら次の書き込み要求サイズをバッファサイズから書き込んだサイズを引いたものにする
			if (bufferSize - comSize < 4096) {
				requestSize = bufferSize - comSize;
			}
		}
		*readBytes = comSize;
		//スマートポインタの管理下に置く
		return std::shared_ptr<char>(
			buffer, std::default_delete<char[]>());
	}
开发者ID:thayamizu,项目名称:Nyx,代码行数:33,代码来源:OggReader.cpp


示例12: cvorbis_seek_sample

static int
cvorbis_seek_sample (DB_fileinfo_t *_info, int sample) {
    ogg_info_t *info = (ogg_info_t *)_info;
    if (sample < 0) {
        trace ("vorbis: negative seek sample - ignored, but it is a bug!\n");
        return -1;
    }
    if (!info->info.file) {
        trace ("vorbis: file is NULL on seek\n");
        return -1;
    }
    if (sample == 0) {
        deadbeef->pl_lock ();
        const char *filetype = deadbeef->pl_find_meta_raw(info->it, ":FILETYPE");
        if (filetype && strncmp(filetype, "Ogg Vorbis", 10)) {
            sample = 1; // workaround libvorbis bug #1486 (ddb issue #1116)
        }
        deadbeef->pl_unlock ();
    }
    sample += info->it->startsample;
    trace ("vorbis: seek to sample %d\n", sample);
    int res = ov_pcm_seek (&info->vorbis_file, sample);
    if (res != 0 && res != OV_ENOSEEK) {
        trace ("vorbis: error %x seeking to sample %d\n", res, sample);
        return -1;
    }
    int tell = ov_pcm_tell (&info->vorbis_file);
    if (tell != sample) {
        trace ("vorbis: failed to do sample-accurate seek (%d->%d)\n", sample, tell);
    }
    trace ("vorbis: seek successful\n")
    _info->readpos = (float)(sample - info->it->startsample)/_info->fmt.samplerate;
    info->next_update = -2;
    return 0;
}
开发者ID:saivert,项目名称:deadbeef,代码行数:35,代码来源:vorbis.c


示例13: l

void OggAudioSource::setDecoderPosition(Int64 startFrame)
{
	RScopedLock l(&mDecodeLock);

	ov_pcm_seek(&mOggFile, startFrame * getNumChannels());
	if(startFrame < getLength() * getSampleRate())
		mEOF = false;
}
开发者ID:Chenhx,项目名称:moai-dev,代码行数:8,代码来源:OggAudioSource.cpp


示例14: SeekVorbisStream

void SeekVorbisStream(MFAudioStream *pStream, float seconds)
{
	MFVorbisStream *pVS = (MFVorbisStream*)pStream->pStreamData;
#if defined(VORBIS_TREMOR)
	ov_pcm_seek(&pVS->vorbisFile, (ogg_int64_t)(seconds*(float)pVS->pInfo->rate));
#else
	ov_time_seek(&pVS->vorbisFile, seconds);
#endif
}
开发者ID:RemedyGameJam,项目名称:fuji,代码行数:9,代码来源:MFSound_Vorbis.cpp


示例15: alGenBuffers

        void OggFileStream::init(const ALuint& source,
                                 const int& position_in_file,
                                 const int& position_in_buffer,
                                 const bool& is_event)
        {
          // create buffers for reading in flip mode
          alGenBuffers(2,m_buffers) ;
          
          InternalMessage("Sound", "enter oggreader Init") ;

          // Create Ogg Stream on the file
          m_stream = new OggVorbis_File() ;
          int error = ov_fopen((char*)m_file_name.c_str(),m_stream) ;
          if (error < 0)
          {
            ErrorMessage("[OpenAL::OggReader] Can't read the samples") ;
            return ;
          }

          // Get sound information
          vorbis_info* Infos = ov_info(m_stream,-1) ;

          m_sample_rate = Infos->rate ;
          m_samples_by_buffer = (ALsizei)(Infos->channels * Infos->rate * m_update_time) ;
          switch (Infos->channels)
          {
          case 1:
            m_format = AL_FORMAT_MONO16 ;
            break;
          case 2:
            m_format = AL_FORMAT_STEREO16 ;
            break;
          default:
            ErrorMessage("[OpenAL::OggReader] Audio Format audio not supported (more than 2 channel)") ;
            return ;
          }

          int pos = 0 ;
          if (position_in_file > 0)
          {
            pos = position_in_file-m_samples_by_buffer+position_in_buffer+1 ;
          }
          ov_pcm_seek(m_stream,pos) ;

          // Load the buffers
          loadBuffer(m_buffers[0],is_event) ;
          loadBuffer(m_buffers[1],is_event) ;
          alSourceQueueBuffers(source,2,m_buffers) ;
          if (alGetError() != AL_NO_ERROR)
          {
            InformationMessage("Sound",
                "[OpenAL::OggReader] Impossible to queue the buffers") ;
            return ;
          }

          InternalMessage("Sound", "leave oggreader Init") ;
        }
开发者ID:BackupTheBerlios,项目名称:projet-univers-svn,代码行数:57,代码来源:ogg_file_stream.cpp


示例16: endianness

long long int
StreamOGGSoundBuffer::filler(ALBuffer& buf, size_t size, bool repeat)
{
	const int endianness(0);  // 0 LittleEndian, 1 BigEndian. Usually 0
	const int sign(1);        // Signed(1) or unsigned(0) data. Usually 1.
	const short BPS(16);	  // Bits per sample. We default to 16
	int chunk(size < OGG_BUFF_SIZE ? ((int)size) : OGG_BUFF_SIZE);
	char* array = new char[chunk]();
	long read(0);
	int err(0);
	ALenum alErr(AL_NO_ERROR);
	SSerror error(SSerror::SS_NO_ERROR);

	/* Try to read 'size' bytes into pcmData field. */
	pcmData.clear();
	do {
		/* Read from Ogg file into temporal array */
		read = ov_read(oggFile, array, chunk, endianness, BPS/8, sign, &bitStreamSection);

		if (read > 0) {
			/* Store fetched audio data */
			pcmData.insert(pcmData.end(), array, &array[read]);
			size -= read;
			chunk = size < OGG_BUFF_SIZE ? ((int)size) : OGG_BUFF_SIZE;

		} else if (read == 0 && repeat) {
			/* End of audio data, must repeat. */
			read = ov_pcm_seek(oggFile, 0);
			bitStreamSection = 0;
			ASSERT(read==0);
			read = 1;  // continue iteration
		}

	} while (read > 0 && chunk > 0);

	if (read < 0) {
		/* Error fetching audio data from Ogg file */
		std::map<int, const char*> strErr = {{OV_HOLE, "OV_HOLE"},
											{OV_EBADLINK, "OV_EBADLINK"},
											{OV_EINVAL, "OV_EINVAL"}};
		debug("Can't read OGG file. Error: %s\n", strErr[read]);
		delete[] array;
		return -1ll;

	} else {
		/* Fill OpenAL buffer with fetched audio data */
		alBufferData(buf, format, &pcmData[0], pcmData.size(), freq);
	}

	delete[] array;
	if (alGetError() != AL_NO_ERROR) {
		return -1ll;
	}

	return ((long long int)pcmData.size());
}
开发者ID:agudpp,项目名称:CordobaZombie,代码行数:56,代码来源:SoundBuffer.cpp


示例17: gauX_sample_source_ogg_seek

gc_int32 gauX_sample_source_ogg_seek(void* in_context, gc_int32 in_sampleOffset)
{
  gau_SampleSourceOggContext* ctx = &((gau_SampleSourceOgg*)in_context)->context;
  gc_int32 ret;
  gc_mutex_lock(ctx->oggMutex);
  ret = ov_pcm_seek(&ctx->oggFile, in_sampleOffset);
  ctx->endOfSamples = 0;
  gc_mutex_unlock(ctx->oggMutex);
  return ret;
}
开发者ID:dazzlex27,项目名称:S3DGE,代码行数:10,代码来源:gau.c


示例18: assert

// QC:U
size_t VorbisPCMSource::seek(size_t position, int whence) {
	assert(canSeek);
	xerror(whence == SEEK_SET, "VorbisPCMSource::seek : whence parameter not supported.");
	if(!ov_pcm_seek(&of, position)) {
		eofReached = false;
		return position;
	}

	xerror(false, "VorbisPCMSource::seek : Could not seek at position %d in %s.", position, f->name());
	return 0;
}
开发者ID:Dustpup,项目名称:aurora-game-engine,代码行数:12,代码来源:vorbis_pcm_source.cpp


示例19: ov_pcm_seek

	bool VorbisDecoder::rewind()
	{
		int result = ov_pcm_seek(&handle, 0);

		if(result == 0)
		{
			eof = false;
			return true;
		}

		return false;
	}
开发者ID:leafo,项目名称:moonscript-love,代码行数:12,代码来源:VorbisDecoder.cpp


示例20: ov_pcm_seek

bool VorbisStream::seek(const Timestamp &where) {
	// Vorbisfile uses the sample pair number, thus we always use "false" for the isStereo parameter
	// of the convertTimeToStreamPos helper.
	int res = ov_pcm_seek(&_ovFile, convertTimeToStreamPos(where, getRate(), false).totalNumberOfFrames());
	if (res) {
		warning("Error seeking in Vorbis stream (%d)", res);
		_pos = _bufferEnd;
		return false;
	}

	return refill();
}
开发者ID:Templier,项目名称:scummvm-test,代码行数:12,代码来源:vorbis.cpp



注:本文中的ov_pcm_seek函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C++ ov_pcm_total函数代码示例发布时间:2022-05-30
下一篇:
C++ ov_open_callbacks函数代码示例发布时间:2022-05-30
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap