示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
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;
}