import getBufferListLength from './getBufferListLength';

const findChannelData = (bufferList: AudioBuffer[], channelNumber: number, index: number) => {
  let offset = 0;
  for (let i = 0; i < bufferList.length; i ++) {
    const buffer = bufferList[i];
    const length = bufferList[i].length;
    if (index < offset + length) {
      return [buffer.getChannelData(channelNumber), offset + length] as [Float32Array, number];
    }
    offset += length;
  }
  throw new Error('No channel data found.');
}

export default (
  callback: (sample: number, index: number) => void,
  bufferList: AudioBuffer[],
  channelNumber: number,
  start: number = 0,
  end: number = getBufferListLength(bufferList)
) => {
  let [channelData, bufferEnd] = findChannelData(bufferList, channelNumber, start);
  for (let i = start; i < end; i ++) {
    if (i >= bufferEnd) {
      [channelData, bufferEnd] = findChannelData(bufferList, channelNumber, i);
    }
    callback(channelData[i], i);
  }
}
