//------------------------------------------------------------------------- bool R::readFrame(AudioFrame& f) { if (_seekWanted) { _seekWanted = false; _frameIndex = _seekWantedIdx; if (_frameIndex >= getFrameCount()) return false; unsigned long n = getSampleBytes()*getChannelCount(); _pReader->seek(getHeaderLength()+n*_frameIndex); } // si on depasse la fin du fichier unsigned long i, frameCount = getFrameCount(); // the call to getFrameCount() defines _sampleBytes & other stuff if (_frameIndex >= frameCount) return false; if (_selectedChannel > _channelCount) throw Exception("Unavailable selected channel #" + String::valueOf(_selectedChannel), __FILE__, __LINE__); if (_sampleBytes == 2) // 16 bits { if (_channelCount == 1) f.setData(_pReader->readInt2()); else if (_channelCount == 2) { if (_selectedChannel == 0) { f.setData(_pReader->readInt2()); _pReader->readInt2(); } else { _pReader->readInt2(); f.setData(_pReader->readInt2()); } } else // multi-channels { for (i=0; i<_selectedChannel; i++) _pReader->readInt2(); f.setData(_pReader->readInt2()); for (i++; i<_channelCount; i++) _pReader->readInt2(); } } else if (_sampleBytes == 1) // 8 bits { if (_channelCount == 1) f.setData(_pReader->readChar()); else if (_channelCount == 2) { if (_selectedChannel == 0) { f.setData(_pReader->readChar()); _pReader->readChar(); } else { _pReader->readChar(); f.setData(_pReader->readChar()); } } else // multi-channels { for (i=0; i<_selectedChannel; i++) _pReader->readChar(); f.setData(_pReader->readChar()); for (i++; i<_channelCount; i++) _pReader->readChar(); } } else throw Exception("Unimplemented code (TODO)", __FILE__, __LINE__); f.setValidity(true); _frameIndex++; return true; // invalid frame }