bool PAPlayer::AddPacketsToStream(int stream, CAudioDecoder &dec) { if (!m_pAudioDecoder[stream] || dec.GetStatus() == STATUS_NO_FILE) return false; bool ret = false; int amount = m_resampler[stream].GetInputSamples(); if (amount > 0 && amount <= (int)dec.GetDataSize()) { // resampler wants more data - let's feed it m_resampler[stream].PutFloatData((float *)dec.GetData(amount), amount); ret = true; } else if (m_resampler[stream].GetData(m_packet[stream][0].packet)) { // got some data from our resampler - construct audio packet m_packet[stream][0].length = PACKET_SIZE; m_packet[stream][0].stream = stream; unsigned char *pcmPtr = m_packet[stream][0].packet; int len = m_packet[stream][0].length; StreamCallback(&m_packet[stream][0]); memcpy(m_pcmBuffer[stream]+m_bufferPos[stream], pcmPtr, len); m_bufferPos[stream] += len; while (m_bufferPos[stream] >= (int)m_pAudioDecoder[stream]->GetChunkLen()) { int rtn = m_pAudioDecoder[stream]->AddPackets(m_pcmBuffer[stream], m_bufferPos[stream]); if (rtn > 0) { m_bufferPos[stream] -= rtn; memmove(m_pcmBuffer[stream], m_pcmBuffer[stream] + rtn, m_bufferPos[stream]); } else //no pcm data added { int sleepTime = MathUtils::round_int(m_pAudioDecoder[stream]->GetCacheTime() * 200.0); Sleep(std::max(sleepTime, 1)); } } // something done ret = true; } return ret; }
bool PAPlayer::AddPacketsToStream(int stream, CAudioDecoder &dec) { if (!m_pAudioDecoder[stream] || dec.GetStatus() == STATUS_NO_FILE) return false; bool ret = false; int amount = m_resampler[stream].GetInputSamples(); if (amount > 0 && amount <= (int)dec.GetDataSize()) { // resampler wants more data - let's feed it m_resampler[stream].PutFloatData((float *)dec.GetData(amount), amount); ret = true; } else if (m_Chunklen[stream] > m_pAudioDecoder[stream]->GetSpace()) { // resampler probably have data but wait until we can send atleast a packet ret = false; } else if (m_resampler[stream].GetData(m_packet[stream][0].packet)) { // got some data from our resampler - construct audio packet m_packet[stream][0].length = PACKET_SIZE; m_packet[stream][0].stream = stream; unsigned char *pcmPtr = m_packet[stream][0].packet; int len = m_packet[stream][0].length; StreamCallback(&m_packet[stream][0]); memcpy(m_pcmBuffer[stream]+m_bufferPos[stream], pcmPtr, len); m_bufferPos[stream] += len; while (m_bufferPos[stream] >= (int)m_pAudioDecoder[stream]->GetChunkLen()) { int rtn = m_pAudioDecoder[stream]->AddPackets(m_pcmBuffer[stream], m_bufferPos[stream]); m_bufferPos[stream] -= rtn; memcpy(m_pcmBuffer[stream], m_pcmBuffer[stream] + rtn, m_bufferPos[stream]); } // something done ret = true; } return ret; }
bool PAPlayer::AddPacketsToStream(int stream, CAudioDecoder &dec) { if (!m_pStream[stream] || dec.GetStatus() == STATUS_NO_FILE) return false; bool ret = false; int nAvail = snd_pcm_frames_to_bytes(m_pStream[stream], snd_pcm_avail_update(m_pStream[stream])); if (nAvail < PACKET_SIZE) { return false; } if (m_resampler[stream].GetData(m_packet[stream][0].packet)) { // got some data from our resampler - construct audio packet m_packet[stream][0].length = PACKET_SIZE; m_packet[stream][0].stream = stream; unsigned char *pcmPtr = m_packet[stream][0].packet; // handle volume de-amp m_amp[stream].DeAmplify((short *)pcmPtr, m_packet[stream][0].length / 2); StreamCallback(&m_packet[stream][0]); while ( pcmPtr < m_packet[stream][0].packet + m_packet[stream][0].length) { int nPeriodSize = snd_pcm_frames_to_bytes(m_pStream[stream],m_periods[stream]); if ( pcmPtr + nPeriodSize > m_packet[stream][0].packet + m_packet[stream][0].length) { nPeriodSize = m_packet[stream][0].packet + m_packet[stream][0].length - pcmPtr; } int framesToWrite = snd_pcm_bytes_to_frames(m_pStream[stream],nPeriodSize); int writeResult = snd_pcm_writei(m_pStream[stream], pcmPtr, framesToWrite); if ( writeResult == -EPIPE ) { CLog::Log(LOGDEBUG, "PAPlayer::AddPacketsToStream - buffer underun (tried to write %d frames)", framesToWrite); int err = snd_pcm_prepare(m_pStream[stream]); CHECK_ALSA(LOGERROR,"prepare after EPIPE", err); } else if (writeResult != framesToWrite) { CLog::Log(LOGERROR, "PAPlayer::AddPacketsToStream - failed to write %d frames. " "bad write (err: %d) - %s", framesToWrite, writeResult, snd_strerror(writeResult)); break; } //else // m_bytesSentOut += nPeriodSize; pcmPtr += nPeriodSize; } // something done ret = true; } else { // resampler wants more data - let's feed it int amount = m_resampler[stream].GetInputSamples(); if (amount > 0 && amount <= (int)dec.GetDataSize()) { // needs some data - let's feed it m_resampler[stream].PutFloatData((float *)dec.GetData(amount), amount); ret = true; } } return ret; }