/** Turns a binary tag into a series of ID3_Frame objects attached to the ** tag. ** ** \code ** ID3_Tag myTag; ** uchar header[ID3_TAGHEADERSIZE]; ** uchar *buffer; ** luint tagSize; ** ** // get ID3_TAGHEADERSIZE from a socket or somewhere ** // ... ** ** if ((tagSize = ID3_IsTagHeader(ourSourceBuffer)) > -1) ** { ** // read a further 'tagSize' bytes in ** // from our data source ** // ... ** ** if (buffer = new uchar[tagSize]) ** { ** // now we will call ID3_Tag::Parse() ** // with these values (explained later) ** myTag.Parse(header, buffer); ** ** // do something with the objects, ** // like look for titles, artists, etc. ** // ... ** ** // free the buffer ** delete [] buffer; ** } ** } ** \endcode ** ** \sa ID3_Frame ** @param header The byte header read in from the data source. ** @param buffer The remainder of the tag (not including the data source) ** read in from the data source. **/ size_t ID3_Tag::Parse(const uchar header[ID3_TAGHEADERSIZE], const uchar *buffer) { size_t size = ID3_Tag::IsV2Tag(header); if (0 == size) { return 0; } BString buf; buf.reserve(ID3_TagHeader::SIZE + size); buf.append(reinterpret_cast<const BString::value_type *>(header), ID3_TagHeader::SIZE); buf.append(reinterpret_cast<const BString::value_type *>(buffer), size); return this->Parse(buf.data(), buf.size()); }
BString io::readBinary(ID3_Reader& reader, size_t len) { BString binary; binary.reserve(len); size_t remaining = len; const size_t SIZE = 1024; ID3_Reader::char_type buf[SIZE]; while (!reader.atEnd() && remaining > 0) { size_t numRead = reader.readChars(buf, min(remaining, SIZE)); remaining -= numRead; binary.append(reinterpret_cast<BString::value_type *>(buf), numRead); } return binary; }