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; }
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; }