Ejemplo n.º 1
0
bool wxSoundFileStream::Record(wxUint32 time)
{
  if (m_state != wxSOUND_FILE_STOPPED)
    return false;

  if (!PrepareToRecord(time))
    return false;

  FinishPreparation(m_sndformat->GetBytesFromTime(time));

  m_state = wxSOUND_FILE_RECORDING;
  if (!StartProduction(wxSOUND_INPUT))
    return false;

  return true;
}
Ejemplo n.º 2
0
bool wxSoundWave::PrepareToPlay()
{
    wxUint32 signature, len;
    bool end_headers;
    
    if (!m_input) {
        m_snderror = wxSOUND_INVSTRM;
        return false;
    }
    
    wxDataInputStream data(*m_input);
    data.BigEndianOrdered(false);

    // Get the first signature
    FAIL_WITH(m_input->Read(&signature, 4).LastRead() != 4, wxSOUND_INVSTRM);
    FAIL_WITH(wxUINT32_SWAP_ON_BE(signature) != RIFF_SIGNATURE, wxSOUND_INVSTRM);
    // "RIFF"
    
    len = data.Read32();
    wxUnusedVar(len);
    FAIL_WITH(m_input->LastRead() != 4, wxSOUND_INVSTRM);
    // dummy len

    // Get the second signature
    FAIL_WITH(m_input->Read(&signature, 4).LastRead() != 4, wxSOUND_INVSTRM);
    FAIL_WITH(wxUINT32_SWAP_ON_BE(signature) != WAVE_SIGNATURE, wxSOUND_INVSTRM);
    // "WAVE"
    
    end_headers = false;
    // Chunk loop
    while (!end_headers) {
        FAIL_WITH(m_input->Read(&signature, 4).LastRead() != 4, wxSOUND_INVSTRM);
        
        len = data.Read32();
        FAIL_WITH(m_input->LastRead() != 4, wxSOUND_INVSTRM);
        
        switch (wxUINT32_SWAP_ON_BE(signature)) {
            case FMT_SIGNATURE: {  // "fmt "
                wxUint16 format, channels, byte_p_spl, bits_p_spl;
                wxUint32 sample_fq, byte_p_sec;

                // Get the common parameters
                data >> format >> channels >> sample_fq 
                     >> byte_p_sec >> byte_p_spl >> bits_p_spl;
                len -= 16;
                
                switch (format) {
                    case 0x01: // PCM
                        if (!HandleOutputPCM(data, len, channels, sample_fq,
                                             byte_p_sec, byte_p_spl,
                                             bits_p_spl))
                            return false;
                        break;
                    case 0x02: // MS ADPCM
                        if (!HandleOutputMSADPCM(data, len,
                                                 channels, sample_fq,
                                                 byte_p_sec, byte_p_spl,
                                                 bits_p_spl))
                            return false;
                        break;
                    case 0x40: // G721
                        if (!HandleOutputG721(data, len,
                                              channels, sample_fq,
                                              byte_p_sec, byte_p_spl,
                                              bits_p_spl))
                            return false;
                        break;
                    default: 
                        m_snderror = wxSOUND_NOCODEC;
                        return false;
                }
                break;
            }
            case DATA_SIGNATURE: // "data"
                m_base_offset = m_input->TellI();
                end_headers = true;
                FinishPreparation(len);
                break;
            default:
                // We pass the chunk
                m_input->SeekI(len, wxFromCurrent);
                break;
        }
    }
    return true;
}