Spaces:
Runtime error
Runtime error
| class Wav { | |
| public: | |
| struct WAV_HEADER { | |
| char RIFF[4] = { 'R','I','F','F' }; //RIFF��ʶ | |
| unsigned long ChunkSize; //�ļ���С-8 | |
| char WAVE[4] = { 'W','A','V','E' }; //WAVE�� | |
| char fmt[4] = { 'f','m','t',' ' }; //fmt�� | |
| unsigned long Subchunk1Size; //fmt���С | |
| unsigned short AudioFormat; //�����ʽ | |
| unsigned short NumOfChan; //������ | |
| unsigned long SamplesPerSec; //������ | |
| unsigned long bytesPerSec; //ÿ�����ֽ��� | |
| unsigned short blockAlign; //�������ֽ� | |
| unsigned short bitsPerSample; //������� | |
| char Subchunk2ID[4] = { 'd','a','t','a' }; //���ݿ� | |
| unsigned long Subchunk2Size; //���ݿ��С | |
| WAV_HEADER(unsigned long cs = 36, unsigned long sc1s = 16, unsigned short af = 1, unsigned short nc = 1, unsigned long sr = 22050, unsigned long bps = 44100, unsigned short ba = 2, unsigned short bips = 16, unsigned long sc2s = 0) :ChunkSize(cs), Subchunk1Size(sc1s), AudioFormat(af), NumOfChan(nc), SamplesPerSec(sr), bytesPerSec(bps), blockAlign(ba), bitsPerSample(bips), Subchunk2Size(sc2s) {} | |
| }; | |
| using iterator = int16_t*; | |
| Wav(unsigned long cs = 36, unsigned long sc1s = 16, unsigned short af = 1, unsigned short nc = 1, unsigned long sr = 22050, unsigned long bps = 44100, unsigned short ba = 2, unsigned short bips = 16, unsigned long sc2s = 0) :header({ | |
| cs, | |
| sc1s, | |
| af, | |
| nc, | |
| sr, | |
| bps, | |
| ba, | |
| bips, | |
| sc2s | |
| }), Data(nullptr), StartPos(44) { | |
| dataSize = 0; | |
| SData = nullptr; | |
| } | |
| Wav(unsigned long sr, unsigned long length, const void* data) :header({ | |
| 36, | |
| 16, | |
| 1, | |
| 1, | |
| sr, | |
| sr * 2, | |
| 2, | |
| 16, | |
| length | |
| }), Data(new char[length + 1]), StartPos(44) | |
| { | |
| header.ChunkSize = 36 + length; | |
| memcpy(Data, data, length); | |
| SData = reinterpret_cast<int16_t*>(Data); | |
| dataSize = length / 2; | |
| } | |
| Wav(const wchar_t* Path); | |
| Wav(const Wav& input); | |
| Wav(Wav&& input) noexcept; | |
| Wav& operator=(const Wav& input) = delete; | |
| Wav& operator=(Wav&& input) noexcept; | |
| ~Wav() { destory(); } | |
| Wav& cat(const Wav& input); | |
| bool isEmpty() const { return this->header.Subchunk2Size == 0; } | |
| const char* getData() const { return Data; } | |
| char* getData() { return Data; } | |
| WAV_HEADER getHeader() const { return header; } | |
| WAV_HEADER& Header() { return header; } | |
| void destory() const { delete[] Data; } | |
| void changeData(const void* indata,long length,int sr) | |
| { | |
| delete[] Data; | |
| Data = new char[length]; | |
| memcpy(Data, indata, length); | |
| header.ChunkSize = 36 + length; | |
| header.Subchunk2Size = length; | |
| header.SamplesPerSec = sr; | |
| header.bytesPerSec = 2 * sr; | |
| } | |
| int16_t& operator[](const size_t index) const | |
| { | |
| if (index < dataSize) | |
| return *(SData + index); | |
| return *(SData + dataSize - 1); | |
| } | |
| iterator begin() const | |
| { | |
| return reinterpret_cast<int16_t*>(Data); | |
| } | |
| iterator end() const | |
| { | |
| return reinterpret_cast<int16_t*>(Data + header.Subchunk2Size); | |
| } | |
| int64_t getDataLen()const | |
| { | |
| return static_cast<int64_t>(dataSize); | |
| } | |
| private: | |
| WAV_HEADER header; | |
| char* Data; | |
| int16_t* SData; | |
| size_t dataSize; | |
| int StartPos; | |
| }; | |