int xvid_decore(void *handle, int opt, void *param1, void *param2) { switch (opt) { case XVID_DEC_CREATE: return decoder_create((xvid_dec_create_t *) param1); case XVID_DEC_DESTROY: return decoder_destroy((DECODER *) handle); case XVID_DEC_DECODE: return decoder_decode((DECODER *) handle, (xvid_dec_frame_t *) param1, (xvid_dec_stats_t*) param2); default: return XVID_ERR_FAIL; } }
HRESULT XAudPlayer::CreateBuffer(const int volume) { /*const int status =*/ decoder_decode(m_decoder, NULL); WAVEFORMATEX wfex; wfex.wFormatTag = WAVE_FORMAT_PCM; wfex.nChannels = 2;//m_decoder->output_buffer->nb_channels; wfex.nSamplesPerSec = 44100; //Bogus frequency value - the real value gets set as data is decompressed - look for SetFrequency wfex.wBitsPerSample = 16;//m_decoder->output_buffer->bytes_per_sample; wfex.cbSize = 0; wfex.nBlockAlign = (wfex.nChannels * wfex.wBitsPerSample) / (WORD)8; wfex.nAvgBytesPerSec = wfex.nBlockAlign * wfex.nSamplesPerSec; CreateStreamingBuffer(&wfex); m_pDSBuffer->SetCurrentPosition(0); m_pDSBuffer->SetVolume(volume); return S_OK; }
gboolean decoder_chain_decode(Decoder *self, guchar *rawData, gsize rawSize) { DecoderPrivate *priv = DECODER_GET_PRIVATE (self); gboolean ret = TRUE; if (priv->chain != NULL) { priv->enc_data = g_malloc0(sizeof(guchar) * priv->enc_size); ret = decoder_chain_decode(priv->chain, priv->enc_data, priv->enc_size); } if (ret) ret = decoder_decode(self, rawData, rawSize, priv->enc_data, priv->enc_size); priv->raw_data = rawData; g_free(priv->enc_data); priv->enc_data = NULL; if (priv->chain != NULL) decoder_chain_cleanup(priv->chain); return ret; }
int XAudPlayer::Tick() { DWORD playpos, writepos; m_pDSBuffer->GetCurrentPosition(&playpos, &writepos); if (m_fEndData) { int timeplayed = playpos - m_lastplaypos; if (timeplayed < 0) { timeplayed += m_dwBufferSize; } m_cDataLeft -= timeplayed; if (m_cDataLeft < 0) { End(); return 0; } m_lastplaypos = playpos; return 1; } const DWORD halfaround = (playpos + m_dwBufferSize/2);// % m_dwBufferSize; if (halfaround > m_dwBufferSize) { if (m_dwNextWriteOffset < playpos && (m_dwNextWriteOffset > (halfaround % m_dwBufferSize))) { return 1; } } else if (m_dwNextWriteOffset < playpos || m_dwNextWriteOffset > halfaround) { return 1; } int status = decoder_decode(m_decoder, NULL); if (status == XA_ERROR_TIMEOUT) // Need more input { unsigned char mp3_buffer[4096]; const int nb_read = fread(mp3_buffer, 1, 4096, file); if (nb_read == 0) { //if (feof(file)) // { //fprintf(stderr, "end of file\n"); status = 0xffff; // } //else // { //fprintf(stderr, "cannot read bytes from input\n"); //status = 0xffff; // } } else { /* feed the input buffer */ decoder_input_send_message(m_decoder, XA_MEMORY_INPUT_MESSAGE_FEED, mp3_buffer, nb_read); status = decoder_decode(m_decoder, NULL); } } if (status == XA_SUCCESS) { /*HRESULT hr =*/ m_pDSBuffer->SetFrequency(m_decoder->status->info.frequency); const unsigned int cbData = m_decoder->output_buffer->nb_samples*m_decoder->output_buffer->bytes_per_sample*m_decoder->output_buffer->nb_channels; VOID* pbBuffer = NULL; DWORD dwBufferLength; VOID* pbBuffer2 = NULL; DWORD dwBufferLength2; HRESULT hr; if( FAILED( hr = m_pDSBuffer->Lock(m_dwNextWriteOffset, cbData, &pbBuffer, &dwBufferLength, &pbBuffer2, &dwBufferLength2, 0L) ) ) return 0; memcpy(pbBuffer, m_decoder->output_buffer->pcm_samples, dwBufferLength); if (dwBufferLength < cbData) { memcpy(pbBuffer2, ((char*)(m_decoder->output_buffer->pcm_samples))+dwBufferLength, dwBufferLength2); } m_pDSBuffer->Unlock(pbBuffer,dwBufferLength, pbBuffer2, dwBufferLength2); pbBuffer = NULL; m_dwNextWriteOffset += cbData; m_dwNextWriteOffset %= m_dwBufferSize; if (!m_fStarted) { m_pDSBuffer->Play(0, 0, DSBPLAY_LOOPING); m_fStarted = true; } } else { m_fEndData = true; m_cDataLeft = m_dwNextWriteOffset - playpos; if (m_cDataLeft < 0) { m_cDataLeft += m_dwBufferSize; } m_lastplaypos = playpos; //End(); } return 1; }