> ## Documentation Index
> Fetch the complete documentation index at: https://docs.simular.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Loopback

> Loopback capture of a []'s audio output (what its speakers are playing).

Loopback capture of a \[`Machine`]'s audio output (what its speakers
are playing).

Obtain via \[`Machine.loopback`]. Call `start()` before capturing with
`record()` or `drain()`; samples are interleaved `f32` in the
requested `AudioFormat`.

## Constructor

```typescript
Loopback(): Loopback
```

### Returns

`Loopback`

## Properties

<ResponseField name={"channels"} type={"number"} required>
  Number of interleaved channels (1 = mono, 2 = stereo).
</ResponseField>

<ResponseField name={"sampleRate"} type={"number"} required>
  Samples per second per channel (e.g. 44100, 48000).
</ResponseField>

## Methods

### drain()

```typescript
drain(): SamplesBuffer
```

Drains all buffered samples and returns them as a `SamplesBuffer`.

Typical usage: call `start()`, do work while audio accumulates in
the background, call `stop()`, then call `drain()` to collect
everything that was captured.

#### Returns

`SamplesBuffer`

### record()

```typescript
record(durationMs: number): SamplesBuffer
```

Blocks for exactly `duration_ms` and returns the captured audio as
a `SamplesBuffer`. Useful for streaming fixed-size chunks while
the source is still running.

#### Parameters

<ResponseField name={"durationMs"} type={"number"} required />

#### Returns

`SamplesBuffer`

### start()

```typescript
start(): void
```

Begin capturing. Must be called before `record()` or `drain()`.

### stop()

```typescript
stop(): void
```

Stop capturing. May be started again with `start()`. After
stopping, call `drain()` to collect remaining buffered samples.
