<!--
{
  "availability" : [
    "iOS: 27.0.0 -",
    "iPadOS: 27.0.0 -",
    "macCatalyst: 27.0.0 -",
    "macOS: 27.0.0 -",
    "tvOS: 27.0.0 -",
    "visionOS: 27.0.0 -"
  ],
  "documentType" : "symbol",
  "framework" : "RealityKit",
  "identifier" : "/documentation/RealityKit/Audio/playAudio(_:at:)",
  "metadataVersion" : "0.1.0",
  "role" : "Type Method",
  "symbol" : {
    "kind" : "Type Method",
    "modules" : [
      "RealityKit"
    ],
    "preciseIdentifier" : "s:17RealityFoundation5AudioO04playC0_2atAA0C23PlaybackGroupControllerCSayAA0C8ResourceC_AA6EntityCtG_So11AVAudioTimeCtKFZ"
  },
  "title" : "playAudio(_:at:)"
}
-->

# playAudio(_:at:)

Prepares and plays multiple audio resources for synchronized playback at a specified time.

```
@discardableResult @MainActor static func playAudio(_ resourcesAndEntities: [(AudioResource, Entity)], at time: AVAudioTime) throws -> AudioPlaybackGroupController
```

## Parameters

`resourcesAndEntities`

An array of tuples containing audio
resources and their associated entities. The same entity can appear
multiple times with different resources.

`time`

The AVAudioTime when the audio file should start playing.

## Return Value

An `AudioPlaybackGroupController` for the synchronized group.

## Discussion

This method creates an `AudioPlaybackGroupController` that coordinates
playback across multiple entity/resource pairs. All audio sources in
the group will be synchronized to sample-accurate precision.
After the controller is created, the [`play(at:)`](/documentation/RealityKit/AudioPlaybackGroupController/play(at:))
method of the controller that it returns is immediately called.

Any call to play() will cancel pending scheduled time and play audio immediately,
while any call to playAudio(at: AVAudioTime) will cancel current scheduled time
and schedule for new time.

To maintain precise timing, audio preparation must complete before the scheduled playback time.
If preparation is still in progress when the scheduled time arrives, or if the scheduled time is
in the past, playback will start immediately, which may result in timing drift.

The returned controller’s [`isPlaying`](/documentation/RealityKit/AudioPlaybackGroupController/isPlaying) property
becomes `true` immediately after this call returns. Code that checks `isPlaying`
to decide whether to trigger another action — such as starting a different sound —
reads the correct state without racing against the scheduled start time.

> Throws: An error if the audio preparation fails.

## Usage Notes

- The same entity can be used with multiple resources in the same group
- Entities can participate in multiple groups simultaneously
- The completion handler fires when the longest resource finishes

---

Copyright &copy; 2026 Apple Inc. All rights reserved. | [Terms of Use](https://www.apple.com/legal/internet-services/terms/site.html) | [Privacy Policy](https://www.apple.com/privacy/privacy-policy)