MicrophoneArray.java

package org.hammer.audio.acquisition;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

/** Immutable description of a microphone array tied to a synchronized multichannel source. */
public final class MicrophoneArray {

  private final List<Microphone> microphones;

  /** Create a microphone array from unique microphone ids and channels. */
  public MicrophoneArray(List<Microphone> microphones) {
    if (microphones == null || microphones.isEmpty()) {
      throw new IllegalArgumentException("microphones must not be empty");
    }
    List<Microphone> copy = new ArrayList<>(microphones);
    copy.sort(Comparator.comparingInt(Microphone::channel));
    for (int i = 0; i < copy.size(); i++) {
      Microphone mic = copy.get(i);
      if (mic.channel() != i) {
        throw new IllegalArgumentException("channels must be contiguous from 0");
      }
      for (int j = i + 1; j < copy.size(); j++) {
        if (mic.id().equals(copy.get(j).id())) {
          throw new IllegalArgumentException("duplicate microphone id: " + mic.id());
        }
      }
    }
    this.microphones = List.copyOf(copy);
  }

  /** Return microphones ordered by channel. */
  public List<Microphone> microphones() {
    return microphones;
  }

  /** Number of synchronized channels. */
  public int channels() {
    return microphones.size();
  }

  /** Microphone metadata for a channel. */
  public Microphone microphone(int channel) {
    return microphones.get(channel);
  }
}