SDL3pp
A slim C++ wrapper for SDL3
Loading...
Searching...
No Matches
SDL3pp_mixer.h
1#ifndef SDL3PP_MIXER_H_
2#define SDL3PP_MIXER_H_
3
4#include "SDL3pp_audio.h"
5#include "SDL3pp_version.h"
6
7#if defined(SDL3PP_ENABLE_MIXER) || defined(SDL3PP_DOC)
8
9#include <SDL3_mixer/SDL_mixer.h>
10
11namespace SDL {
12
108// Forward decl
109struct Mixer;
110
112using MixerRaw = MIX_Mixer*;
113
114// Forward decl
115struct MixerRef;
116
117// Forward decl
118struct Audio;
119
121using AudioRaw = MIX_Audio*;
122
123// Forward decl
124struct AudioRef;
125
126// Forward decl
127struct Track;
128
130using TrackRaw = MIX_Track*;
131
132// Forward decl
133struct TrackRef;
134
135// Forward decl
136struct Group;
137
139using GroupRaw = MIX_Group*;
140
141// Forward decl
142struct GroupRef;
143
144// Forward decl
145struct AudioDecoder;
146
148using AudioDecoderRaw = MIX_AudioDecoder*;
149
150// Forward decl
151struct AudioDecoderRef;
152
153// Forward decl
154struct MixerLock;
155
189using PostMixCallback = void(SDLCALL*)(void* userdata,
190 MixerRaw mixer,
191 const AudioSpec* spec,
192 float* pcm,
193 int samples);
194
230 void(MixerRaw mixer, const AudioSpec* spec, float* pcm, int samples)>;
231
248class Mixer
249{
250 MixerRaw m_resource = nullptr;
251
252public:
254 constexpr Mixer(std::nullptr_t = nullptr) noexcept
255 : m_resource(nullptr)
256 {
257 }
258
266 constexpr explicit Mixer(MixerRaw resource) noexcept
267 : m_resource(resource)
268 {
269 }
270
272 constexpr Mixer(const Mixer& other) noexcept = delete;
273
275 constexpr Mixer(Mixer&& other) noexcept
276 : Mixer(other.release())
277 {
278 }
279
280 constexpr Mixer(const MixerRef& other) = delete;
281
282 constexpr Mixer(MixerRef&& other) = delete;
283
329 Mixer(AudioDeviceRef devid, const AudioSpec& spec);
330
358 Mixer(const AudioSpec& spec);
359
361 ~Mixer() { MIX_DestroyMixer(m_resource); }
362
364 constexpr Mixer& operator=(Mixer&& other) noexcept
365 {
366 std::swap(m_resource, other.m_resource);
367 return *this;
368 }
369
371 Mixer& operator=(const Mixer& other) = delete;
372
374 constexpr MixerRaw get() const noexcept { return m_resource; }
375
377 constexpr MixerRaw release() noexcept
378 {
379 auto r = m_resource;
380 m_resource = nullptr;
381 return r;
382 }
383
385 constexpr auto operator<=>(const Mixer& other) const noexcept = default;
386
388 constexpr explicit operator bool() const noexcept { return !!m_resource; }
389
411 void Destroy();
412
430
458 void GetFormat(AudioSpec* spec);
459
501 MixerLock Lock();
502
523 void Unlock(MixerLock&& lock);
524
580 Audio LoadAudio_IO(IOStreamRef io, bool predecode, bool closeio = false);
581
609 Audio LoadAudio(StringParam path, bool predecode);
610
667 Audio LoadAudioNoCopy(SourceBytes data, bool free_when_done);
668
703 const AudioSpec& spec,
704 bool closeio = false);
705
739 Audio LoadRawAudio(SourceBytes data, const AudioSpec& spec);
740
781 const AudioSpec& spec,
782 bool free_when_done);
783
819 Audio CreateSineWaveAudio(int hz, float amplitude, Sint64 ms);
820
845
860
895 void PlayTag(StringParam tag, PropertiesRef options);
896
926 bool PlayAudio(AudioRef audio);
927
956 void StopAllTracks(Sint64 fade_out_ms);
957
988 void StopTag(StringParam tag, Sint64 fade_out_ms);
989
1009 void PauseAllTracks();
1010
1036 void PauseTag(StringParam tag);
1037
1057 void ResumeAllTracks();
1058
1084 void ResumeTag(StringParam tag);
1085
1110 void SetGain(float gain);
1111
1127 float GetGain();
1128
1162 void SetTagGain(StringParam tag, float gain);
1163
1191 void SetFrequencyRatio(float ratio);
1192
1208 float GetFrequencyRatio();
1209
1240
1264 void SetPostMixCallback(PostMixCallback cb, void* userdata);
1265
1288
1340 int Generate(TargetBytes buffer);
1341};
1342
1349{
1350 using Mixer::Mixer;
1351
1359 constexpr MixerRef(MixerRaw resource) noexcept
1360 : Mixer(resource)
1361 {
1362 }
1363
1371 constexpr MixerRef(const Mixer& resource) noexcept
1372 : Mixer(resource.get())
1373 {
1374 }
1375
1383 constexpr MixerRef(Mixer&& resource) noexcept
1384 : Mixer(std::move(resource).release())
1385 {
1386 }
1387
1389 constexpr MixerRef(const MixerRef& other) noexcept
1390 : Mixer(other.get())
1391 {
1392 }
1393
1395 constexpr MixerRef(MixerRef&& other) noexcept
1396 : Mixer(other.get())
1397 {
1398 }
1399
1402
1404 MixerRef& operator=(const MixerRef& other) noexcept
1405 {
1406 release();
1407 Mixer::operator=(Mixer(other.get()));
1408 return *this;
1409 }
1410
1412 constexpr operator MixerRaw() const noexcept { return get(); }
1413};
1414
1457{
1458 MixerRef m_lock;
1459
1460public:
1505
1507 MixerLock(const MixerLock& other) = delete;
1508
1510 MixerLock(MixerLock&& other) noexcept
1511 : m_lock(std::move(other.m_lock))
1512 {
1513 }
1514
1536
1537 MixerLock& operator=(const MixerLock& other) = delete;
1538
1540 MixerLock& operator=(MixerLock&& other) noexcept
1541 {
1542 std::swap(m_lock, other.m_lock);
1543 return *this;
1544 }
1545
1547 constexpr operator bool() const { return bool(m_lock); }
1548
1569 void reset();
1570
1572 MixerRef resource() const { return m_lock; }
1573
1575 void release() { m_lock.release(); }
1576};
1577
1595{
1596 AudioRaw m_resource = nullptr;
1597
1598public:
1600 constexpr Audio(std::nullptr_t = nullptr) noexcept
1601 : m_resource(nullptr)
1602 {
1603 }
1604
1612 constexpr explicit Audio(AudioRaw resource) noexcept
1613 : m_resource(resource)
1614 {
1615 }
1616
1618 constexpr Audio(const Audio& other) noexcept = delete;
1619
1621 constexpr Audio(Audio&& other) noexcept
1622 : Audio(other.release())
1623 {
1624 }
1625
1626 constexpr Audio(const AudioRef& other) = delete;
1627
1628 constexpr Audio(AudioRef&& other) = delete;
1629
1687 Audio(MixerRef mixer, IOStreamRef io, bool predecode, bool closeio = false);
1688
1718 Audio(MixerRef mixer, StringParam path, bool predecode);
1719
1767
1803 IOStreamRef io,
1804 const AudioSpec& spec,
1805 bool closeio = false);
1806
1841 Audio(MixerRef mixer, SourceBytes data, const AudioSpec& spec);
1842
1844 ~Audio() { MIX_DestroyAudio(m_resource); }
1845
1847 constexpr Audio& operator=(Audio&& other) noexcept
1848 {
1849 std::swap(m_resource, other.m_resource);
1850 return *this;
1851 }
1852
1854 Audio& operator=(const Audio& other) = delete;
1855
1857 constexpr AudioRaw get() const noexcept { return m_resource; }
1858
1860 constexpr AudioRaw release() noexcept
1861 {
1862 auto r = m_resource;
1863 m_resource = nullptr;
1864 return r;
1865 }
1866
1868 constexpr auto operator<=>(const Audio& other) const noexcept = default;
1869
1871 constexpr explicit operator bool() const noexcept { return !!m_resource; }
1872
1891 void Destroy();
1892
1938
1971
1987 void GetFormat(AudioSpec* spec);
1988
2008
2031};
2032
2039{
2040 using Audio::Audio;
2041
2049 constexpr AudioRef(AudioRaw resource) noexcept
2050 : Audio(resource)
2051 {
2052 }
2053
2061 constexpr AudioRef(const Audio& resource) noexcept
2062 : Audio(resource.get())
2063 {
2064 }
2065
2073 constexpr AudioRef(Audio&& resource) noexcept
2074 : Audio(std::move(resource).release())
2075 {
2076 }
2077
2079 constexpr AudioRef(const AudioRef& other) noexcept
2080 : Audio(other.get())
2081 {
2082 }
2083
2085 constexpr AudioRef(AudioRef&& other) noexcept
2086 : Audio(other.get())
2087 {
2088 }
2089
2092
2094 AudioRef& operator=(const AudioRef& other) noexcept
2095 {
2096 release();
2097 Audio::operator=(Audio(other.get()));
2098 return *this;
2099 }
2100
2102 constexpr operator AudioRaw() const noexcept { return get(); }
2103};
2104
2121using StereoGains = MIX_StereoGains;
2122
2133using Point3D = MIX_Point3D;
2134
2156using TrackStoppedCallback = void(SDLCALL*)(void* userdata, TrackRaw track);
2157
2181
2218using TrackMixCallback = void(SDLCALL*)(void* userdata,
2219 TrackRaw track,
2220 const AudioSpec* spec,
2221 float* pcm,
2222 int samples);
2223
2261 void(TrackRaw track, const AudioSpec* spec, float* pcm, int samples)>;
2262
2278{
2279 TrackRaw m_resource = nullptr;
2280
2281public:
2283 constexpr Track(std::nullptr_t = nullptr) noexcept
2284 : m_resource(nullptr)
2285 {
2286 }
2287
2295 constexpr explicit Track(TrackRaw resource) noexcept
2296 : m_resource(resource)
2297 {
2298 }
2299
2301 constexpr Track(const Track& other) noexcept = delete;
2302
2304 constexpr Track(Track&& other) noexcept
2305 : Track(other.release())
2306 {
2307 }
2308
2309 constexpr Track(const TrackRef& other) = delete;
2310
2311 constexpr Track(TrackRef&& other) = delete;
2312
2338
2340 ~Track() { MIX_DestroyTrack(m_resource); }
2341
2343 constexpr Track& operator=(Track&& other) noexcept
2344 {
2345 std::swap(m_resource, other.m_resource);
2346 return *this;
2347 }
2348
2350 Track& operator=(const Track& other) = delete;
2351
2353 constexpr TrackRaw get() const noexcept { return m_resource; }
2354
2356 constexpr TrackRaw release() noexcept
2357 {
2358 auto r = m_resource;
2359 m_resource = nullptr;
2360 return r;
2361 }
2362
2364 constexpr auto operator<=>(const Track& other) const noexcept = default;
2365
2367 constexpr explicit operator bool() const noexcept { return !!m_resource; }
2368
2385 void Destroy();
2386
2404
2418
2449 void SetAudio(AudioRef audio);
2450
2490 void SetAudioStream(AudioStreamRef stream);
2491
2539 void SetIOStream(IOStreamRef io, bool closeio = false);
2540
2589 const AudioSpec& spec,
2590 bool closeio = false);
2591
2618 void Tag(StringParam tag);
2619
2642 void Untag(StringParam tag);
2643
2657
2692 void SetPlaybackPosition(Sint64 frames);
2693
2719
2742
2768 int GetLoops();
2769
2798 void SetLoops(int num_loops);
2799
2821
2843
2869
2893
2920
3032 void Play(PropertiesRef options = nullptr);
3033
3065 bool Stop(Sint64 fade_out_frames);
3066
3088 bool Pause();
3089
3111 bool Resume();
3112
3135 bool Playing();
3136
3160 bool Paused();
3161
3186 void SetGain(float gain);
3187
3203 float GetGain();
3204
3227 void SetFrequencyRatio(float ratio);
3228
3253 float GetFrequencyRatio();
3254
3289 void SetOutputChannelMap(std::span<const int> chmap);
3290
3320 void SetStereo(const StereoGains& gains);
3321
3364 void Set3DPosition(const Point3D& position);
3365
3382
3405 void SetGroup(GroupRef group);
3406
3436 void SetStoppedCallback(TrackStoppedCallback cb, void* userdata);
3437
3466
3496 void SetRawCallback(TrackMixCallback cb, void* userdata);
3497
3525 void SetRawCallback(TrackMixCB cb);
3526
3559 void SetCookedCallback(TrackMixCallback cb, void* userdata);
3560
3592};
3593
3600{
3601 using Track::Track;
3602
3610 constexpr TrackRef(TrackRaw resource) noexcept
3611 : Track(resource)
3612 {
3613 }
3614
3622 constexpr TrackRef(const Track& resource) noexcept
3623 : Track(resource.get())
3624 {
3625 }
3626
3634 constexpr TrackRef(Track&& resource) noexcept
3635 : Track(std::move(resource).release())
3636 {
3637 }
3638
3640 constexpr TrackRef(const TrackRef& other) noexcept
3641 : Track(other.get())
3642 {
3643 }
3644
3646 constexpr TrackRef(TrackRef&& other) noexcept
3647 : Track(other.get())
3648 {
3649 }
3650
3653
3655 TrackRef& operator=(const TrackRef& other) noexcept
3656 {
3657 release();
3658 Track::operator=(Track(other.get()));
3659 return *this;
3660 }
3661
3663 constexpr operator TrackRaw() const noexcept { return get(); }
3664};
3665
3698using GroupMixCallback = void(SDLCALL*)(void* userdata,
3699 GroupRaw group,
3700 const AudioSpec* spec,
3701 float* pcm,
3702 int samples);
3703
3738 void(GroupRaw group, const AudioSpec* spec, float* pcm, int samples)>;
3739
3758{
3759 GroupRaw m_resource = nullptr;
3760
3761public:
3763 constexpr Group(std::nullptr_t = nullptr) noexcept
3764 : m_resource(nullptr)
3765 {
3766 }
3767
3775 constexpr explicit Group(GroupRaw resource) noexcept
3776 : m_resource(resource)
3777 {
3778 }
3779
3781 constexpr Group(const Group& other) noexcept = delete;
3782
3784 constexpr Group(Group&& other) noexcept
3785 : Group(other.release())
3786 {
3787 }
3788
3789 constexpr Group(const GroupRef& other) = delete;
3790
3791 constexpr Group(GroupRef&& other) = delete;
3792
3824
3826 ~Group() { MIX_DestroyGroup(m_resource); }
3827
3829 constexpr Group& operator=(Group&& other) noexcept
3830 {
3831 std::swap(m_resource, other.m_resource);
3832 return *this;
3833 }
3834
3836 Group& operator=(const Group& other) = delete;
3837
3839 constexpr GroupRaw get() const noexcept { return m_resource; }
3840
3842 constexpr GroupRaw release() noexcept
3843 {
3844 auto r = m_resource;
3845 m_resource = nullptr;
3846 return r;
3847 }
3848
3850 constexpr auto operator<=>(const Group& other) const noexcept = default;
3851
3853 constexpr explicit operator bool() const noexcept { return !!m_resource; }
3854
3867 void Destroy();
3868
3886
3900
3926 void SetPostMixCallback(GroupMixCallback cb, void* userdata);
3927};
3928
3935{
3936 using Group::Group;
3937
3945 constexpr GroupRef(GroupRaw resource) noexcept
3946 : Group(resource)
3947 {
3948 }
3949
3957 constexpr GroupRef(const Group& resource) noexcept
3958 : Group(resource.get())
3959 {
3960 }
3961
3969 constexpr GroupRef(Group&& resource) noexcept
3970 : Group(std::move(resource).release())
3971 {
3972 }
3973
3975 constexpr GroupRef(const GroupRef& other) noexcept
3976 : Group(other.get())
3977 {
3978 }
3979
3981 constexpr GroupRef(GroupRef&& other) noexcept
3982 : Group(other.get())
3983 {
3984 }
3985
3988
3990 GroupRef& operator=(const GroupRef& other) noexcept
3991 {
3992 release();
3993 Group::operator=(Group(other.get()));
3994 return *this;
3995 }
3996
3998 constexpr operator GroupRaw() const noexcept { return get(); }
3999};
4000
4001#ifdef SDL3PP_DOC
4002
4010#define SDL_MIXER_MAJOR_VERSION
4011
4019#define SDL_MIXER_MINOR_VERSION
4020
4028#define SDL_MIXER_MICRO_VERSION
4029
4037#define SDL_MIXER_VERSION \
4038 SDL_VERSIONNUM( \
4039 SDL_MIXER_MAJOR_VERSION, SDL_MIXER_MINOR_VERSION, SDL_MIXER_MICRO_VERSION)
4040
4046#define SDL_MIXER_VERSION_ATLEAST(X, Y, Z) \
4047 ((SDL_MIXER_MAJOR_VERSION >= X) && \
4048 (SDL_MIXER_MAJOR_VERSION > X || SDL_MIXER_MINOR_VERSION >= Y) && \
4049 (SDL_MIXER_MAJOR_VERSION > X || SDL_MIXER_MINOR_VERSION > Y || \
4050 SDL_MIXER_MICRO_VERSION >= Z))
4051
4052#endif // SDL3PP_DOC
4053
4054namespace MIX {
4055
4072inline int Version() { return MIX_Version(); }
4073
4092inline void Init() { CheckError(MIX_Init()); }
4093
4128inline void Quit() { MIX_Quit(); }
4129
4130} // namespace MIX
4131
4152inline int GetNumAudioDecoders() { return MIX_GetNumAudioDecoders(); }
4153
4183inline const char* GetAudioDecoder(int index)
4184{
4185 return MIX_GetAudioDecoder(index);
4186}
4187
4234{
4235 return Mixer(devid, spec);
4236}
4237
4238inline Mixer::Mixer(AudioDeviceRef devid, const AudioSpec& spec)
4239 : m_resource(CheckError(MIX_CreateMixerDevice(devid, &spec)))
4240{
4241}
4242
4243inline Mixer::Mixer(const AudioSpec& spec)
4244 : m_resource(CheckError(MIX_CreateMixer(&spec)))
4245{
4246}
4247
4275inline Mixer CreateMixer(const AudioSpec& spec) { return Mixer(spec); }
4276
4300inline void DestroyMixer(MixerRaw mixer) { MIX_DestroyMixer(mixer); }
4301
4303
4322{
4323 return CheckError(MIX_GetMixerProperties(mixer));
4324}
4325
4327{
4328 return SDL::GetMixerProperties(m_resource);
4329}
4330
4331namespace prop::Mixer {
4332
4333constexpr auto DEVICE_NUMBER = MIX_PROP_MIXER_DEVICE_NUMBER;
4334
4335} // namespace prop::Mixer
4336
4365inline void GetMixerFormat(MixerRef mixer, AudioSpec* spec)
4366{
4367 CheckError(MIX_GetMixerFormat(mixer, spec));
4368}
4369
4370inline void Mixer::GetFormat(AudioSpec* spec)
4371{
4372 SDL::GetMixerFormat(m_resource, spec);
4373}
4374
4418inline void LockMixer(MixerRef mixer) { MIX_LockMixer(mixer); }
4419
4420inline MixerLock Mixer::Lock() { return {MixerRef(*this)}; }
4421
4423 : m_lock(std::move(resource))
4424{
4425 LockMixer(m_lock);
4426}
4427
4450inline void UnlockMixer(MixerRef mixer) { MIX_UnlockMixer(mixer); }
4451
4452inline void Mixer::Unlock(MixerLock&& lock)
4453{
4454 SDL_assert_paranoid(lock.resource() == *this);
4455 std::move(lock).reset();
4456}
4457
4458inline void MixerLock::reset()
4459{
4460 if (!m_lock) return;
4461 UnlockMixer(m_lock);
4462 m_lock = {};
4463}
4464
4522 IOStreamRef io,
4523 bool predecode,
4524 bool closeio = false)
4525{
4526 return Audio(mixer, io, predecode, closeio);
4527}
4528
4529inline Audio Mixer::LoadAudio_IO(IOStreamRef io, bool predecode, bool closeio)
4530{
4531 return Audio(m_resource, io, predecode, closeio);
4532}
4533
4535 IOStreamRef io,
4536 bool predecode,
4537 bool closeio)
4538 : m_resource(MIX_LoadAudio_IO(mixer, io, predecode, closeio))
4539{
4540}
4541
4542inline Audio::Audio(MixerRef mixer, StringParam path, bool predecode)
4543 : m_resource(MIX_LoadAudio(mixer, path, predecode))
4544{
4545}
4546
4548 : m_resource(CheckError(MIX_LoadAudioWithProperties(props)))
4549{
4550}
4551
4553 IOStreamRef io,
4554 const AudioSpec& spec,
4555 bool closeio)
4556 : m_resource(CheckError(MIX_LoadRawAudio_IO(mixer, io, &spec, closeio)))
4557{
4558}
4559
4560inline Audio::Audio(MixerRef mixer, SourceBytes data, const AudioSpec& spec)
4561 : m_resource(CheckError(
4562 MIX_LoadRawAudio(mixer, data.data(), data.size_bytes(), &spec)))
4563{
4564}
4565
4594inline Audio LoadAudio(MixerRef mixer, StringParam path, bool predecode)
4595{
4596 return Audio(mixer, std::move(path), predecode);
4597}
4598
4599inline Audio Mixer::LoadAudio(StringParam path, bool predecode)
4600{
4601 return Audio(m_resource, std::move(path), predecode);
4602}
4603
4661 SourceBytes data,
4662 bool free_when_done)
4663{
4664 return Audio(CheckError(MIX_LoadAudioNoCopy(
4665 mixer, data.data(), data.size_bytes(), free_when_done)));
4666}
4667
4668inline Audio Mixer::LoadAudioNoCopy(SourceBytes data, bool free_when_done)
4669{
4670 return SDL::LoadAudioNoCopy(m_resource, std::move(data), free_when_done);
4671}
4672
4720{
4721 return Audio(props);
4722}
4723
4724namespace prop::Audio {
4725
4726constexpr auto LOAD_IOSTREAM_POINTER = MIX_PROP_AUDIO_LOAD_IOSTREAM_POINTER;
4727
4728constexpr auto LOAD_CLOSEIO_BOOLEAN = MIX_PROP_AUDIO_LOAD_CLOSEIO_BOOLEAN;
4729
4730constexpr auto LOAD_PREDECODE_BOOLEAN = MIX_PROP_AUDIO_LOAD_PREDECODE_BOOLEAN;
4731
4732constexpr auto LOAD_PREFERRED_MIXER_POINTER =
4733 MIX_PROP_AUDIO_LOAD_PREFERRED_MIXER_POINTER;
4734
4735constexpr auto LOAD_SKIP_METADATA_TAGS_BOOLEAN =
4736 MIX_PROP_AUDIO_LOAD_SKIP_METADATA_TAGS_BOOLEAN;
4737
4738constexpr auto DECODER_STRING = MIX_PROP_AUDIO_DECODER_STRING;
4739
4740} // namespace prop::Audio
4741
4777 IOStreamRef io,
4778 const AudioSpec& spec,
4779 bool closeio = false)
4780{
4781 return Audio(mixer, io, spec, closeio);
4782}
4783
4785 const AudioSpec& spec,
4786 bool closeio)
4787{
4788 return Audio(m_resource, io, spec, closeio);
4789}
4790
4826 SourceBytes data,
4827 const AudioSpec& spec)
4828{
4829 return Audio(mixer, std::move(data), spec);
4830}
4831
4833{
4834 return Audio(m_resource, std::move(data), spec);
4835}
4836
4878 SourceBytes data,
4879 const AudioSpec& spec,
4880 bool free_when_done)
4881{
4882 return Audio(CheckError(MIX_LoadRawAudioNoCopy(
4883 mixer, data.data(), data.size_bytes(), &spec, free_when_done)));
4884}
4885
4887 const AudioSpec& spec,
4888 bool free_when_done)
4889{
4891 m_resource, std::move(data), spec, free_when_done);
4892}
4893
4931 int hz,
4932 float amplitude,
4933 Sint64 ms)
4934{
4935 return Audio(CheckError(MIX_CreateSineWaveAudio(mixer, hz, amplitude, ms)));
4936}
4937
4938inline Audio Mixer::CreateSineWaveAudio(int hz, float amplitude, Sint64 ms)
4939{
4940 return SDL::CreateSineWaveAudio(m_resource, hz, amplitude, ms);
4941}
4942
4987{
4988 return CheckError(MIX_GetAudioProperties(audio));
4989}
4990
4992{
4993 return SDL::GetAudioProperties(m_resource);
4994}
4995
4996namespace prop::MixMetadata {
4997
4998constexpr auto TITLE_STRING = MIX_PROP_METADATA_TITLE_STRING;
4999
5000constexpr auto ARTIST_STRING = MIX_PROP_METADATA_ARTIST_STRING;
5001
5002constexpr auto ALBUM_STRING = MIX_PROP_METADATA_ALBUM_STRING;
5003
5004constexpr auto COPYRIGHT_STRING = MIX_PROP_METADATA_COPYRIGHT_STRING;
5005
5006constexpr auto TRACK_NUMBER = MIX_PROP_METADATA_TRACK_NUMBER;
5007
5008constexpr auto TOTAL_TRACKS_NUMBER = MIX_PROP_METADATA_TOTAL_TRACKS_NUMBER;
5009
5010constexpr auto YEAR_NUMBER = MIX_PROP_METADATA_YEAR_NUMBER;
5011
5012constexpr auto DURATION_FRAMES_NUMBER =
5013 MIX_PROP_METADATA_DURATION_FRAMES_NUMBER;
5014
5015constexpr auto DURATION_INFINITE_BOOLEAN =
5016 MIX_PROP_METADATA_DURATION_INFINITE_BOOLEAN;
5017
5018} // namespace prop::MixMetadata
5019
5053{
5054 return MIX_GetAudioDuration(audio);
5055}
5056
5057inline Sint64 Audio::GetDuration() { return SDL::GetAudioDuration(m_resource); }
5058
5060constexpr Sint64 DURATION_UNKNOWN = MIX_DURATION_UNKNOWN;
5061
5063constexpr Sint64 DURATION_INFINITE = MIX_DURATION_INFINITE;
5064
5081inline void GetAudioFormat(AudioRef audio, AudioSpec* spec)
5082{
5083 CheckError(MIX_GetAudioFormat(audio, spec));
5084}
5085
5086inline void Audio::GetFormat(AudioSpec* spec)
5087{
5088 SDL::GetAudioFormat(m_resource, spec);
5089}
5090
5111inline void DestroyAudio(AudioRaw audio) { MIX_DestroyAudio(audio); }
5112
5114
5137inline Track CreateTrack(MixerRef mixer) { return Track(mixer); }
5138
5139inline TrackRef Mixer::CreateTrack() { return Track(m_resource); }
5140
5142 : m_resource(CheckError(MIX_CreateTrack(mixer)))
5143{
5144}
5145
5164inline void DestroyTrack(TrackRaw track) { MIX_DestroyTrack(track); }
5165
5167
5186{
5187 return CheckError(MIX_GetTrackProperties(track));
5188}
5189
5191{
5192 return SDL::GetTrackProperties(m_resource);
5193}
5194
5209{
5210 return CheckError(MIX_GetTrackMixer(track));
5211}
5212
5213inline MixerRef Track::GetMixer() { return SDL::GetTrackMixer(m_resource); }
5214
5246inline void SetTrackAudio(TrackRef track, AudioRef audio)
5247{
5248 CheckError(MIX_SetTrackAudio(track, audio));
5249}
5250
5251inline void Track::SetAudio(AudioRef audio)
5252{
5253 SDL::SetTrackAudio(m_resource, audio);
5254}
5255
5297{
5298 CheckError(MIX_SetTrackAudioStream(track, stream));
5299}
5300
5302{
5303 SDL::SetTrackAudioStream(m_resource, stream);
5304}
5305
5353inline void SetTrackIOStream(TrackRef track,
5354 IOStreamRef io,
5355 bool closeio = false)
5356{
5357 CheckError(MIX_SetTrackIOStream(track, io, closeio));
5358}
5359
5360inline void Track::SetIOStream(IOStreamRef io, bool closeio)
5361{
5362 SDL::SetTrackIOStream(m_resource, io, closeio);
5363}
5364
5414 IOStreamRef io,
5415 const AudioSpec& spec,
5416 bool closeio = false)
5417{
5418 CheckError(MIX_SetTrackRawIOStream(track, io, &spec, closeio));
5419}
5420
5422 const AudioSpec& spec,
5423 bool closeio)
5424{
5425 SDL::SetTrackRawIOStream(m_resource, io, spec, closeio);
5426}
5427
5455inline void TagTrack(TrackRef track, StringParam tag)
5456{
5457 CheckError(MIX_TagTrack(track, tag));
5458}
5459
5460inline void Track::Tag(StringParam tag)
5461{
5462 SDL::TagTrack(m_resource, std::move(tag));
5463}
5464
5488inline void UntagTrack(TrackRef track, StringParam tag)
5489{
5490 MIX_UntagTrack(track, tag);
5491}
5492
5494{
5495 SDL::UntagTrack(m_resource, std::move(tag));
5496}
5497
5512{
5513 int count;
5514 auto result = CheckError(MIX_GetTrackTags(track, &count));
5515 return OwnArray<char*>(result, count);
5516}
5517
5519{
5520 return SDL::GetTrackTags(m_resource);
5521}
5522
5538{
5539 int count;
5540 auto result = CheckError(MIX_GetTaggedTracks(mixer, tag, &count));
5541 return OwnArray<TrackRef>(reinterpret_cast<TrackRef*>(result), count);
5542}
5543
5545{
5546 return SDL::GetTaggedTracks(m_resource, std::move(tag));
5547}
5548
5584inline void SetTrackPlaybackPosition(TrackRef track, Sint64 frames)
5585{
5586 CheckError(MIX_SetTrackPlaybackPosition(track, frames));
5587}
5588
5590{
5591 SDL::SetTrackPlaybackPosition(m_resource, frames);
5592}
5593
5618{
5619 return MIX_GetTrackPlaybackPosition(track);
5620}
5621
5623{
5624 return SDL::GetTrackPlaybackPosition(m_resource);
5625}
5626
5650{
5651 return MIX_GetTrackFadeFrames(track);
5652}
5653
5655{
5656 return SDL::GetTrackFadeFrames(m_resource);
5657}
5658
5685inline int GetTrackLoops(TrackRef track) { return MIX_GetTrackLoops(track); }
5686
5687inline int Track::GetLoops() { return SDL::GetTrackLoops(m_resource); }
5688
5717inline void SetTrackLoops(TrackRef track, int num_loops)
5718{
5719 CheckError(MIX_SetTrackLoops(track, num_loops));
5720}
5721
5722inline void Track::SetLoops(int num_loops)
5723{
5724 SDL::SetTrackLoops(m_resource, num_loops);
5725}
5726
5748{
5749 return MIX_GetTrackAudio(track);
5750}
5751
5752inline AudioRef Track::GetAudio() { return SDL::GetTrackAudio(m_resource); }
5753
5776{
5777 return MIX_GetTrackAudioStream(track);
5778}
5779
5781{
5782 return SDL::GetTrackAudioStream(m_resource);
5783}
5784
5811{
5812 return MIX_GetTrackRemaining(track);
5813}
5814
5816{
5817 return SDL::GetTrackRemaining(m_resource);
5818}
5819
5843{
5844 return MIX_TrackMSToFrames(track, ms.count());
5845}
5846
5848{
5849 return SDL::TrackMSToFrames(m_resource, ms);
5850}
5851
5878{
5879 return Milliseconds(MIX_TrackFramesToMS(track, frames));
5880}
5881
5883{
5884 return SDL::TrackFramesToMS(m_resource, frames);
5885}
5886
5907{
5908 return MIX_AudioMSToFrames(audio, ms.count());
5909}
5910
5912{
5913 return SDL::AudioMSToFrames(m_resource, ms);
5914}
5915
5939{
5940 return Milliseconds(MIX_AudioFramesToMS(audio, frames));
5941}
5942
5944{
5945 return SDL::AudioFramesToMS(m_resource, frames);
5946}
5947
5964inline Sint64 MSToFrames(int sample_rate, Milliseconds ms)
5965{
5966 return MIX_MSToFrames(sample_rate, ms.count());
5967}
5968
5990inline Milliseconds FramesToMS(int sample_rate, Sint64 frames)
5991{
5992 return Milliseconds(MIX_FramesToMS(sample_rate, frames));
5993}
5994
6105inline void PlayTrack(TrackRef track, PropertiesRef options = nullptr)
6106{
6107 CheckError(MIX_PlayTrack(track, options));
6108}
6109
6110inline void Track::Play(PropertiesRef options)
6111{
6112 SDL::PlayTrack(m_resource, options);
6113}
6114
6115namespace prop::Play {
6116
6117constexpr auto LOOPS_NUMBER = MIX_PROP_PLAY_LOOPS_NUMBER;
6118
6119constexpr auto MAX_FRAME_NUMBER = MIX_PROP_PLAY_MAX_FRAME_NUMBER;
6120
6121constexpr auto MAX_MILLISECONDS_NUMBER = MIX_PROP_PLAY_MAX_MILLISECONDS_NUMBER;
6122
6123constexpr auto START_FRAME_NUMBER = MIX_PROP_PLAY_START_FRAME_NUMBER;
6124
6125constexpr auto START_MILLISECOND_NUMBER =
6126 MIX_PROP_PLAY_START_MILLISECOND_NUMBER;
6127
6128constexpr auto LOOP_START_FRAME_NUMBER = MIX_PROP_PLAY_LOOP_START_FRAME_NUMBER;
6129
6130constexpr auto LOOP_START_MILLISECOND_NUMBER =
6131 MIX_PROP_PLAY_LOOP_START_MILLISECOND_NUMBER;
6132
6133constexpr auto FADE_IN_FRAMES_NUMBER = MIX_PROP_PLAY_FADE_IN_FRAMES_NUMBER;
6134
6135constexpr auto FADE_IN_MILLISECONDS_NUMBER =
6136 MIX_PROP_PLAY_FADE_IN_MILLISECONDS_NUMBER;
6137
6138constexpr auto FADE_IN_START_GAIN_FLOAT =
6139 MIX_PROP_PLAY_FADE_IN_START_GAIN_FLOAT;
6140
6141constexpr auto APPEND_SILENCE_FRAMES_NUMBER =
6142 MIX_PROP_PLAY_APPEND_SILENCE_FRAMES_NUMBER;
6143
6144constexpr auto APPEND_SILENCE_MILLISECONDS_NUMBER =
6145 MIX_PROP_PLAY_APPEND_SILENCE_MILLISECONDS_NUMBER;
6146
6147constexpr auto HALT_WHEN_EXHAUSTED_BOOLEAN =
6148 MIX_PROP_PLAY_HALT_WHEN_EXHAUSTED_BOOLEAN;
6149
6150} // namespace prop::Play
6151
6187inline void PlayTag(MixerRef mixer, StringParam tag, PropertiesRef options)
6188{
6189 CheckError(MIX_PlayTag(mixer, tag, options));
6190}
6191
6193{
6194 SDL::PlayTag(m_resource, std::move(tag), options);
6195}
6196
6227inline bool PlayAudio(MixerRef mixer, AudioRef audio)
6228{
6229 return MIX_PlayAudio(mixer, audio);
6230}
6231
6232inline bool Mixer::PlayAudio(AudioRef audio)
6233{
6234 return SDL::PlayAudio(m_resource, audio);
6235}
6236
6269inline bool StopTrack(TrackRef track, Sint64 fade_out_frames)
6270{
6271 return MIX_StopTrack(track, fade_out_frames);
6272}
6273
6274inline bool Track::Stop(Sint64 fade_out_frames)
6275{
6276 return SDL::StopTrack(m_resource, fade_out_frames);
6277}
6278
6308inline void StopAllTracks(MixerRef mixer, Sint64 fade_out_ms)
6309{
6310 CheckError(MIX_StopAllTracks(mixer, fade_out_ms));
6311}
6312
6313inline void Mixer::StopAllTracks(Sint64 fade_out_ms)
6314{
6315 SDL::StopAllTracks(m_resource, fade_out_ms);
6316}
6317
6349inline void StopTag(MixerRef mixer, StringParam tag, Sint64 fade_out_ms)
6350{
6351 CheckError(MIX_StopTag(mixer, tag, fade_out_ms));
6352}
6353
6354inline void Mixer::StopTag(StringParam tag, Sint64 fade_out_ms)
6355{
6356 SDL::StopTag(m_resource, std::move(tag), fade_out_ms);
6357}
6358
6381inline bool PauseTrack(TrackRef track) { return MIX_PauseTrack(track); }
6382
6383inline bool Track::Pause() { return SDL::PauseTrack(m_resource); }
6384
6405inline void PauseAllTracks(MixerRef mixer)
6406{
6407 CheckError(MIX_PauseAllTracks(mixer));
6408}
6409
6410inline void Mixer::PauseAllTracks() { SDL::PauseAllTracks(m_resource); }
6411
6438inline void PauseTag(MixerRef mixer, StringParam tag)
6439{
6440 CheckError(MIX_PauseTag(mixer, tag));
6441}
6442
6444{
6445 SDL::PauseTag(m_resource, std::move(tag));
6446}
6447
6470inline bool ResumeTrack(TrackRef track) { return MIX_ResumeTrack(track); }
6471
6472inline bool Track::Resume() { return SDL::ResumeTrack(m_resource); }
6473
6494inline void ResumeAllTracks(MixerRef mixer)
6495{
6496 CheckError(MIX_ResumeAllTracks(mixer));
6497}
6498
6499inline void Mixer::ResumeAllTracks() { SDL::ResumeAllTracks(m_resource); }
6500
6526inline void ResumeTag(MixerRef mixer, StringParam tag)
6527{
6528 CheckError(MIX_ResumeTag(mixer, tag));
6529}
6530
6532{
6533 SDL::ResumeTag(m_resource, std::move(tag));
6534}
6535
6559inline bool TrackPlaying(TrackRef track) { return MIX_TrackPlaying(track); }
6560
6561inline bool Track::Playing() { return SDL::TrackPlaying(m_resource); }
6562
6586inline bool TrackPaused(TrackRef track) { return MIX_TrackPaused(track); }
6587
6588inline bool Track::Paused() { return SDL::TrackPaused(m_resource); }
6589
6615inline void SetMixerGain(MixerRef mixer, float gain)
6616{
6617 CheckError(MIX_SetMixerGain(mixer, gain));
6618}
6619
6620inline void Mixer::SetGain(float gain) { SDL::SetMixerGain(m_resource, gain); }
6621
6638inline float GetMixerGain(MixerRef mixer) { return MIX_GetMixerGain(mixer); }
6639
6640inline float Mixer::GetGain() { return SDL::GetMixerGain(m_resource); }
6641
6667inline void SetTrackGain(TrackRef track, float gain)
6668{
6669 CheckError(MIX_SetTrackGain(track, gain));
6670}
6671
6672inline void Track::SetGain(float gain) { SDL::SetTrackGain(m_resource, gain); }
6673
6690inline float GetTrackGain(TrackRef track) { return MIX_GetTrackGain(track); }
6691
6692inline float Track::GetGain() { return SDL::GetTrackGain(m_resource); }
6693
6728inline void SetTagGain(MixerRef mixer, StringParam tag, float gain)
6729{
6730 CheckError(MIX_SetTagGain(mixer, tag, gain));
6731}
6732
6733inline void Mixer::SetTagGain(StringParam tag, float gain)
6734{
6735 SDL::SetTagGain(m_resource, std::move(tag), gain);
6736}
6737
6765inline void SetMixerFrequencyRatio(MixerRef mixer, float ratio)
6766{
6767 CheckError(MIX_SetMixerFrequencyRatio(mixer, ratio));
6768}
6769
6770inline void Mixer::SetFrequencyRatio(float ratio)
6771{
6772 SDL::SetMixerFrequencyRatio(m_resource, ratio);
6773}
6774
6792{
6793 return MIX_GetMixerFrequencyRatio(mixer);
6794}
6795
6797{
6798 return SDL::GetMixerFrequencyRatio(m_resource);
6799}
6800
6824inline void SetTrackFrequencyRatio(TrackRef track, float ratio)
6825{
6826 CheckError(MIX_SetTrackFrequencyRatio(track, ratio));
6827}
6828
6829inline void Track::SetFrequencyRatio(float ratio)
6830{
6831 SDL::SetTrackFrequencyRatio(m_resource, ratio);
6832}
6833
6860{
6861 return MIX_GetTrackFrequencyRatio(track);
6862}
6863
6865{
6866 return SDL::GetTrackFrequencyRatio(m_resource);
6867}
6868
6904inline void SetTrackOutputChannelMap(TrackRef track, std::span<const int> chmap)
6905{
6906 CheckError(
6907 MIX_SetTrackOutputChannelMap(track, chmap.data(), narrowS32(chmap.size())));
6908}
6909
6910inline void Track::SetOutputChannelMap(std::span<const int> chmap)
6911{
6912 SDL::SetTrackOutputChannelMap(m_resource, chmap);
6913}
6914
6945inline void SetTrackStereo(TrackRef track, const StereoGains& gains)
6946{
6947 CheckError(MIX_SetTrackStereo(track, &gains));
6948}
6949
6950inline void Track::SetStereo(const StereoGains& gains)
6951{
6952 SDL::SetTrackStereo(m_resource, gains);
6953}
6954
6997inline void SetTrack3DPosition(TrackRef track, const Point3D& position)
6998{
6999 CheckError(MIX_SetTrack3DPosition(track, &position));
7000}
7001
7002inline void Track::Set3DPosition(const Point3D& position)
7003{
7004 SDL::SetTrack3DPosition(m_resource, position);
7005}
7006
7024{
7025 Point3D position;
7026 CheckError(MIX_GetTrack3DPosition(track, &position));
7027 return position;
7028}
7029
7031{
7032 return SDL::GetTrack3DPosition(m_resource);
7033}
7034
7064inline Group CreateGroup(MixerRef mixer) { return Group(mixer); }
7065
7066inline GroupRef Mixer::CreateGroup() { return Group(m_resource); }
7067
7069 : m_resource(CheckError(MIX_CreateGroup(mixer)))
7070{
7071}
7072
7087inline void DestroyGroup(GroupRaw group) { MIX_DestroyGroup(group); }
7088
7090
7109{
7110 return CheckError(MIX_GetGroupProperties(group));
7111}
7112
7114{
7115 return SDL::GetGroupProperties(m_resource);
7116}
7117
7132{
7133 return CheckError(MIX_GetGroupMixer(group));
7134}
7135
7136inline MixerRef Group::GetMixer() { return SDL::GetGroupMixer(m_resource); }
7137
7161inline void SetTrackGroup(TrackRef track, GroupRef group)
7162{
7163 CheckError(MIX_SetTrackGroup(track, group));
7164}
7165
7166inline void Track::SetGroup(GroupRef group)
7167{
7168 SDL::SetTrackGroup(m_resource, group);
7169}
7170
7202 void* userdata)
7203{
7204 CheckError(MIX_SetTrackStoppedCallback(track, cb, userdata));
7205}
7206
7235{
7236 SetTrackStoppedCallback(track, cb.wrapper, cb.data);
7237}
7238
7240{
7241 SDL::SetTrackStoppedCallback(m_resource, cb, userdata);
7242}
7243
7245{
7246 SDL::SetTrackStoppedCallback(m_resource, cb);
7247}
7248
7280 void* userdata)
7281{
7282 CheckError(MIX_SetTrackRawCallback(track, cb, userdata));
7283}
7284
7313{
7314 SetTrackRawCallback(track, cb.wrapper, cb.data);
7315}
7316
7317inline void Track::SetRawCallback(TrackMixCallback cb, void* userdata)
7318{
7319 SDL::SetTrackRawCallback(m_resource, cb, userdata);
7320}
7321
7323{
7324 SDL::SetTrackRawCallback(m_resource, cb);
7325}
7326
7361 void* userdata)
7362{
7363 CheckError(MIX_SetTrackCookedCallback(track, cb, userdata));
7364}
7365
7397{
7398 SetTrackCookedCallback(track, cb.wrapper, cb.data);
7399}
7400
7401inline void Track::SetCookedCallback(TrackMixCallback cb, void* userdata)
7402{
7403 SDL::SetTrackCookedCallback(m_resource, cb, userdata);
7404}
7405
7407{
7408 SDL::SetTrackCookedCallback(m_resource, cb);
7409}
7410
7438 void* userdata)
7439{
7440 CheckError(MIX_SetGroupPostMixCallback(group, cb, userdata));
7441}
7442
7467{
7468 SetGroupPostMixCallback(group, cb.wrapper, cb.data);
7469}
7470
7471inline void Group::SetPostMixCallback(GroupMixCallback cb, void* userdata)
7472{
7473 SDL::SetGroupPostMixCallback(m_resource, cb, userdata);
7474}
7475
7500 PostMixCallback cb,
7501 void* userdata)
7502{
7503 CheckError(MIX_SetPostMixCallback(mixer, cb, userdata));
7504}
7505
7528{
7529 SetPostMixCallback(mixer, cb.wrapper, cb.data);
7530}
7531
7532inline void Mixer::SetPostMixCallback(PostMixCallback cb, void* userdata)
7533{
7534 SDL::SetPostMixCallback(m_resource, cb, userdata);
7535}
7536
7538{
7539 SDL::SetPostMixCallback(m_resource, cb);
7540}
7541
7593inline int Generate(MixerRef mixer, TargetBytes buffer)
7594{
7595 return CheckError(
7596 MIX_Generate(mixer, buffer.data(), narrowS32(buffer.size_bytes())), -1);
7597}
7598
7600{
7601 return SDL::Generate(m_resource, std::move(buffer));
7602}
7603
7620{
7621 AudioDecoderRaw m_resource = nullptr;
7622
7623public:
7625 constexpr AudioDecoder(std::nullptr_t = nullptr) noexcept
7626 : m_resource(nullptr)
7627 {
7628 }
7629
7637 constexpr explicit AudioDecoder(AudioDecoderRaw resource) noexcept
7638 : m_resource(resource)
7639 {
7640 }
7641
7643 constexpr AudioDecoder(const AudioDecoder& other) noexcept = delete;
7644
7646 constexpr AudioDecoder(AudioDecoder&& other) noexcept
7647 : AudioDecoder(other.release())
7648 {
7649 }
7650
7651 constexpr AudioDecoder(const AudioDecoderRef& other) = delete;
7652
7653 constexpr AudioDecoder(AudioDecoderRef&& other) = delete;
7654
7689
7726 bool closeio = false,
7727 PropertiesRef props = nullptr);
7728
7730 ~AudioDecoder() { MIX_DestroyAudioDecoder(m_resource); }
7731
7733 constexpr AudioDecoder& operator=(AudioDecoder&& other) noexcept
7734 {
7735 std::swap(m_resource, other.m_resource);
7736 return *this;
7737 }
7738
7740 AudioDecoder& operator=(const AudioDecoder& other) = delete;
7741
7743 constexpr AudioDecoderRaw get() const noexcept { return m_resource; }
7744
7746 constexpr AudioDecoderRaw release() noexcept
7747 {
7748 auto r = m_resource;
7749 m_resource = nullptr;
7750 return r;
7751 }
7752
7754 constexpr auto operator<=>(const AudioDecoder& other) const noexcept =
7755 default;
7756
7758 constexpr explicit operator bool() const noexcept { return !!m_resource; }
7759
7769 void Destroy();
7770
7794
7810 void GetFormat(AudioSpec* spec);
7811
7832 int DecodeAudio(TargetBytes buffer, const AudioSpec& spec);
7833};
7834
7841{
7843
7851 constexpr AudioDecoderRef(AudioDecoderRaw resource) noexcept
7852 : AudioDecoder(resource)
7853 {
7854 }
7855
7863 constexpr AudioDecoderRef(const AudioDecoder& resource) noexcept
7864 : AudioDecoder(resource.get())
7865 {
7866 }
7867
7875 constexpr AudioDecoderRef(AudioDecoder&& resource) noexcept
7876 : AudioDecoder(std::move(resource).release())
7877 {
7878 }
7879
7881 constexpr AudioDecoderRef(const AudioDecoderRef& other) noexcept
7882 : AudioDecoder(other.get())
7883 {
7884 }
7885
7887 constexpr AudioDecoderRef(AudioDecoderRef&& other) noexcept
7888 : AudioDecoder(other.get())
7889 {
7890 }
7891
7894
7897 {
7898 release();
7900 return *this;
7901 }
7902
7904 constexpr operator AudioDecoderRaw() const noexcept { return get(); }
7905};
7906
7941 PropertiesRef props = nullptr)
7942{
7943 return AudioDecoder(std::move(path), props);
7944}
7945
7947 : m_resource(MIX_CreateAudioDecoder(path, props))
7948{
7949}
7950
7952 bool closeio,
7953 PropertiesRef props)
7954 : m_resource(MIX_CreateAudioDecoder_IO(io, closeio, props))
7955{
7956}
7957
7994 bool closeio = false,
7995 PropertiesRef props = nullptr)
7996{
7997 return AudioDecoder(io, closeio, props);
7998}
7999
8011inline void DestroyAudioDecoder(AudioDecoderRaw audiodecoder)
8012{
8013 MIX_DestroyAudioDecoder(audiodecoder);
8014}
8015
8017
8042{
8043 return CheckError(MIX_GetAudioDecoderProperties(audiodecoder));
8044}
8045
8047{
8048 return SDL::GetAudioDecoderProperties(m_resource);
8049}
8050
8067inline void GetAudioDecoderFormat(AudioDecoderRef audiodecoder, AudioSpec* spec)
8068{
8069 CheckError(MIX_GetAudioDecoderFormat(audiodecoder, spec));
8070}
8071
8073{
8074 SDL::GetAudioDecoderFormat(m_resource, spec);
8075}
8076
8097inline int DecodeAudio(AudioDecoderRef audiodecoder,
8098 TargetBytes buffer,
8099 const AudioSpec& spec)
8100{
8101 return CheckError(
8102 MIX_DecodeAudio(
8103 audiodecoder, buffer.data(), narrowS32(buffer.size_bytes()), &spec),
8104 -1);
8105}
8106
8107inline int AudioDecoder::DecodeAudio(TargetBytes buffer, const AudioSpec& spec)
8108{
8109 return SDL::DecodeAudio(m_resource, std::move(buffer), spec);
8110}
8111
8113
8114} // namespace SDL
8115
8116#endif /* defined(SDL3PP_ENABLE_MIXER) || defined(SDL3PP_DOC) */
8117
8118#endif /* SDL3PP_MIXER_H_ */
An opaque object that represents an audio decoder.
Definition: SDL3pp_mixer.h:7620
constexpr AudioDecoder(AudioDecoderRaw resource) noexcept
Constructs from raw AudioDecoder.
Definition: SDL3pp_mixer.h:7637
constexpr AudioDecoder & operator=(AudioDecoder &&other) noexcept
Assignment operator.
Definition: SDL3pp_mixer.h:7733
constexpr AudioDecoder(const AudioDecoder &other) noexcept=delete
Copy constructor.
constexpr auto operator<=>(const AudioDecoder &other) const noexcept=default
Comparison.
constexpr AudioDecoderRaw get() const noexcept
Retrieves underlying AudioDecoderRaw.
Definition: SDL3pp_mixer.h:7743
constexpr AudioDecoder(std::nullptr_t=nullptr) noexcept
Default ctor.
Definition: SDL3pp_mixer.h:7625
~AudioDecoder()
Destructor.
Definition: SDL3pp_mixer.h:7730
AudioDecoder & operator=(const AudioDecoder &other)=delete
Assignment operator.
constexpr AudioDecoder(AudioDecoder &&other) noexcept
Move constructor.
Definition: SDL3pp_mixer.h:7646
constexpr AudioDecoderRaw release() noexcept
Retrieves underlying AudioDecoderRaw and clear this.
Definition: SDL3pp_mixer.h:7746
An opaque object that represents audio data.
Definition: SDL3pp_mixer.h:1595
constexpr Audio(Audio &&other) noexcept
Move constructor.
Definition: SDL3pp_mixer.h:1621
constexpr Audio(AudioRaw resource) noexcept
Constructs from raw Audio.
Definition: SDL3pp_mixer.h:1612
constexpr AudioRaw release() noexcept
Retrieves underlying AudioRaw and clear this.
Definition: SDL3pp_mixer.h:1860
Audio & operator=(const Audio &other)=delete
Assignment operator.
constexpr Audio(const Audio &other) noexcept=delete
Copy constructor.
constexpr Audio(std::nullptr_t=nullptr) noexcept
Default ctor.
Definition: SDL3pp_mixer.h:1600
constexpr auto operator<=>(const Audio &other) const noexcept=default
Comparison.
constexpr Audio & operator=(Audio &&other) noexcept
Assignment operator.
Definition: SDL3pp_mixer.h:1847
~Audio()
Destructor.
Definition: SDL3pp_mixer.h:1844
constexpr AudioRaw get() const noexcept
Retrieves underlying AudioRaw.
Definition: SDL3pp_mixer.h:1857
An opaque object that represents a grouping of tracks.
Definition: SDL3pp_mixer.h:3758
constexpr Group(const Group &other) noexcept=delete
Copy constructor.
constexpr Group(std::nullptr_t=nullptr) noexcept
Default ctor.
Definition: SDL3pp_mixer.h:3763
~Group()
Destructor.
Definition: SDL3pp_mixer.h:3826
constexpr Group & operator=(Group &&other) noexcept
Assignment operator.
Definition: SDL3pp_mixer.h:3829
constexpr GroupRaw get() const noexcept
Retrieves underlying GroupRaw.
Definition: SDL3pp_mixer.h:3839
constexpr auto operator<=>(const Group &other) const noexcept=default
Comparison.
Group & operator=(const Group &other)=delete
Assignment operator.
constexpr GroupRaw release() noexcept
Retrieves underlying GroupRaw and clear this.
Definition: SDL3pp_mixer.h:3842
constexpr Group(GroupRaw resource) noexcept
Constructs from raw Group.
Definition: SDL3pp_mixer.h:3775
constexpr Group(Group &&other) noexcept
Move constructor.
Definition: SDL3pp_mixer.h:3784
Lock a mixer by obtaining its internal mutex.
Definition: SDL3pp_mixer.h:1457
MixerRef resource() const
Get the reference to locked resource.
Definition: SDL3pp_mixer.h:1572
MixerLock(MixerLock &&other) noexcept
Move constructor.
Definition: SDL3pp_mixer.h:1510
void release()
Releases the lock without unlocking.
Definition: SDL3pp_mixer.h:1575
~MixerLock()
Unlock a mixer previously locked by a call to Mixer.Lock().
Definition: SDL3pp_mixer.h:1535
MixerLock(const MixerLock &other)=delete
Copy constructor.
MixerLock & operator=(MixerLock &&other) noexcept
Assignment operator.
Definition: SDL3pp_mixer.h:1540
An opaque object that represents a mixer.
Definition: SDL3pp_mixer.h:249
constexpr Mixer(MixerRaw resource) noexcept
Constructs from raw Mixer.
Definition: SDL3pp_mixer.h:266
constexpr Mixer(Mixer &&other) noexcept
Move constructor.
Definition: SDL3pp_mixer.h:275
Mixer & operator=(const Mixer &other)=delete
Assignment operator.
constexpr MixerRaw release() noexcept
Retrieves underlying MixerRaw and clear this.
Definition: SDL3pp_mixer.h:377
constexpr Mixer(std::nullptr_t=nullptr) noexcept
Default ctor.
Definition: SDL3pp_mixer.h:254
~Mixer()
Destructor.
Definition: SDL3pp_mixer.h:361
constexpr auto operator<=>(const Mixer &other) const noexcept=default
Comparison.
constexpr MixerRaw get() const noexcept
Retrieves underlying MixerRaw.
Definition: SDL3pp_mixer.h:374
constexpr Mixer & operator=(Mixer &&other) noexcept
Assignment operator.
Definition: SDL3pp_mixer.h:364
constexpr Mixer(const Mixer &other) noexcept=delete
Copy constructor.
Base class for SDL memory allocated array wrap.
Definition: SDL3pp_ownPtr.h:44
Source byte stream.
Definition: SDL3pp_strings.h:237
constexpr size_t size_bytes() const
Retrieves contained size in bytes.
Definition: SDL3pp_strings.h:301
constexpr const char * data() const
Retrieves contained data.
Definition: SDL3pp_strings.h:304
Helpers to use C++ strings parameters.
Definition: SDL3pp_strings.h:43
Target byte stream.
Definition: SDL3pp_strings.h:323
constexpr char * data() const
Retrieves contained data.
Definition: SDL3pp_strings.h:409
constexpr size_t size_bytes() const
Retrieves contained size in bytes.
Definition: SDL3pp_strings.h:406
An opaque object that represents a source of sound output to be mixed.
Definition: SDL3pp_mixer.h:2278
constexpr Track(std::nullptr_t=nullptr) noexcept
Default ctor.
Definition: SDL3pp_mixer.h:2283
constexpr Track & operator=(Track &&other) noexcept
Assignment operator.
Definition: SDL3pp_mixer.h:2343
constexpr Track(TrackRaw resource) noexcept
Constructs from raw Track.
Definition: SDL3pp_mixer.h:2295
constexpr Track(const Track &other) noexcept=delete
Copy constructor.
constexpr Track(Track &&other) noexcept
Move constructor.
Definition: SDL3pp_mixer.h:2304
constexpr TrackRaw get() const noexcept
Retrieves underlying TrackRaw.
Definition: SDL3pp_mixer.h:2353
~Track()
Destructor.
Definition: SDL3pp_mixer.h:2340
constexpr TrackRaw release() noexcept
Retrieves underlying TrackRaw and clear this.
Definition: SDL3pp_mixer.h:2356
constexpr auto operator<=>(const Track &other) const noexcept=default
Comparison.
Track & operator=(const Track &other)=delete
Assignment operator.
#define SDL_assert_paranoid(condition)
An assertion test that is performed only when built with paranoid settings.
Definition: SDL3pp_assert.h:383
SDL_AudioSpec AudioSpec
Format specifier for audio data.
Definition: SDL3pp_audio.h:190
constexpr void CheckError(bool result)
Check and throw if returned value from SDL is an error.
Definition: SDL3pp_error.h:199
void SetRawIOStream(IOStreamRef io, const AudioSpec &spec, bool closeio=false)
Set a Track's input to an IOStream providing raw PCM data.
Definition: SDL3pp_mixer.h:5421
Audio LoadRawAudio(MixerRef mixer, SourceBytes data, const AudioSpec &spec)
Load raw PCM data from a memory buffer.
Definition: SDL3pp_mixer.h:4825
void SetTrackStereo(TrackRef track, const StereoGains &gains)
Force a track to stereo output, with optionally left/right panning.
Definition: SDL3pp_mixer.h:6945
void ResumeAllTracks()
Resume all currently-paused tracks.
Definition: SDL3pp_mixer.h:6499
void SetTrackIOStream(TrackRef track, IOStreamRef io, bool closeio=false)
Set a Track's input to an IOStream.
Definition: SDL3pp_mixer.h:5353
Audio LoadAudioWithProperties(PropertiesRef props)
Load audio for playback through a collection of properties.
Definition: SDL3pp_mixer.h:4719
Audio LoadAudio(StringParam path, bool predecode)
Load audio for playback from a file.
Definition: SDL3pp_mixer.h:4599
void Destroy()
Free a mixer.
Definition: SDL3pp_mixer.h:4302
void SetTrackCookedCallback(TrackRef track, TrackMixCallback cb, void *userdata)
Set a callback that fires when the mixer has transformed a track's audio.
Definition: SDL3pp_mixer.h:7359
MixerRef GetMixer()
Get the Mixer that owns a Group.
Definition: SDL3pp_mixer.h:7136
PropertiesRef GetAudioDecoderProperties(AudioDecoderRef audiodecoder)
Get the properties associated with a AudioDecoder.
Definition: SDL3pp_mixer.h:8041
void SetPlaybackPosition(Sint64 frames)
Seek a playing track to a new position in its input.
Definition: SDL3pp_mixer.h:5589
float GetTrackFrequencyRatio(TrackRef track)
Query the frequency ratio of a track.
Definition: SDL3pp_mixer.h:6859
void GetMixerFormat(MixerRef mixer, AudioSpec *spec)
Get the audio format a mixer is generating.
Definition: SDL3pp_mixer.h:4365
void SetPostMixCallback(GroupMixCallback cb, void *userdata)
Set a callback that fires when a mixer group has completed mixing.
Definition: SDL3pp_mixer.h:7471
void SetTagGain(MixerRef mixer, StringParam tag, float gain)
Set the gain control of all tracks with a specific tag.
Definition: SDL3pp_mixer.h:6728
void SetStoppedCallback(TrackStoppedCallback cb, void *userdata)
Set a callback that fires when a Track is stopped.
Definition: SDL3pp_mixer.h:7239
void SetTrackPlaybackPosition(TrackRef track, Sint64 frames)
Seek a playing track to a new position in its input.
Definition: SDL3pp_mixer.h:5584
void UntagTrack(TrackRef track, StringParam tag)
Remove an arbitrary tag from a track.
Definition: SDL3pp_mixer.h:5488
float GetFrequencyRatio()
Query the frequency ratio of a track.
Definition: SDL3pp_mixer.h:6864
void Unlock(MixerLock &&lock)
Unlock a mixer previously locked by a call to Mixer.Lock().
Definition: SDL3pp_mixer.h:4452
Milliseconds FramesToMS(int sample_rate, Sint64 frames)
Convert sample frames, at a specific sample rate, to milliseconds.
Definition: SDL3pp_mixer.h:5990
void PauseTag(MixerRef mixer, StringParam tag)
Pause all tracks with a specific tag.
Definition: SDL3pp_mixer.h:6438
int DecodeAudio(TargetBytes buffer, const AudioSpec &spec)
Decode more audio from a AudioDecoder.
Definition: SDL3pp_mixer.h:8107
void PlayTrack(TrackRef track, PropertiesRef options=nullptr)
Start (or restart) mixing a track for playback.
Definition: SDL3pp_mixer.h:6105
MIX_Group * GroupRaw
Alias to raw representation for Group.
Definition: SDL3pp_mixer.h:139
Sint64 TrackMSToFrames(TrackRef track, Milliseconds ms)
Convert milliseconds to sample frames for a track's current format.
Definition: SDL3pp_mixer.h:5842
void Untag(StringParam tag)
Remove an arbitrary tag from a track.
Definition: SDL3pp_mixer.h:5493
OwnArray< char * > GetTrackTags(TrackRef track)
Get the tags currently associated with a track.
Definition: SDL3pp_mixer.h:5511
void ResumeTag(MixerRef mixer, StringParam tag)
Resume all tracks with a specific tag.
Definition: SDL3pp_mixer.h:6526
Audio CreateSineWaveAudio(MixerRef mixer, int hz, float amplitude, Sint64 ms)
Create a Audio that generates a sinewave.
Definition: SDL3pp_mixer.h:4930
void SetTrackStoppedCallback(TrackRef track, TrackStoppedCallback cb, void *userdata)
Set a callback that fires when a Track is stopped.
Definition: SDL3pp_mixer.h:7200
MIX_Point3D Point3D
3D coordinates for Track.Set3DPosition.
Definition: SDL3pp_mixer.h:2133
Sint64 GetPlaybackPosition()
Get the current input position of a playing track.
Definition: SDL3pp_mixer.h:5622
const char * GetAudioDecoder(int index)
Report the name of a specific audio decoders.
Definition: SDL3pp_mixer.h:4183
void GetAudioDecoderFormat(AudioDecoderRef audiodecoder, AudioSpec *spec)
Query the initial audio format of a AudioDecoder.
Definition: SDL3pp_mixer.h:8067
Sint64 GetFadeFrames()
Query whether a given track is fading.
Definition: SDL3pp_mixer.h:5654
MixerRef GetMixer()
Get the Mixer that owns a Track.
Definition: SDL3pp_mixer.h:5213
void DestroyAudioDecoder(AudioDecoderRaw audiodecoder)
Destroy the specified audio decoder.
Definition: SDL3pp_mixer.h:8011
void UnlockMixer(MixerRef mixer)
Unlock a mixer previously locked by a call to Mixer.Lock().
Definition: SDL3pp_mixer.h:4450
Track CreateTrack(MixerRef mixer)
Create a new track on a mixer.
Definition: SDL3pp_mixer.h:5137
bool Resume()
Resume a currently-paused track.
Definition: SDL3pp_mixer.h:6472
void SetGroupPostMixCallback(GroupRef group, GroupMixCallback cb, void *userdata)
Set a callback that fires when a mixer group has completed mixing.
Definition: SDL3pp_mixer.h:7436
void SetFrequencyRatio(float ratio)
Set a mixer's master frequency ratio.
Definition: SDL3pp_mixer.h:6770
MixerLock(MixerRef resource)
Lock a mixer by obtaining its internal mutex.
Definition: SDL3pp_mixer.h:4422
void SetTrackAudioStream(TrackRef track, AudioStreamRef stream)
Set a Track's input to an AudioStream.
Definition: SDL3pp_mixer.h:5296
void SetGain(float gain)
Set a mixer's master gain control.
Definition: SDL3pp_mixer.h:6620
Audio LoadRawAudio_IO(MixerRef mixer, IOStreamRef io, const AudioSpec &spec, bool closeio=false)
Load raw PCM data from an IOStream.
Definition: SDL3pp_mixer.h:4776
bool Playing()
Query if a track is currently playing.
Definition: SDL3pp_mixer.h:6561
bool PlayAudio(AudioRef audio)
Play a Audio from start to finish without any management.
Definition: SDL3pp_mixer.h:6232
OwnArray< TrackRef > GetTaggedTracks(StringParam tag)
Get all tracks with a specific tag.
Definition: SDL3pp_mixer.h:5544
int Generate(MixerRef mixer, TargetBytes buffer)
Generate mixer output when not driving an audio device.
Definition: SDL3pp_mixer.h:7593
void SetTrackOutputChannelMap(TrackRef track, std::span< const int > chmap)
Set the current output channel map of a track.
Definition: SDL3pp_mixer.h:6904
AudioRef GetAudio()
Query the Audio assigned to a track.
Definition: SDL3pp_mixer.h:5752
void(SDLCALL *)(void *userdata, TrackRaw track, const AudioSpec *spec, float *pcm, int samples) TrackMixCallback
A callback that fires when a Track is mixing at various stages.
Definition: SDL3pp_mixer.h:2222
Audio LoadAudio_IO(MixerRef mixer, IOStreamRef io, bool predecode, bool closeio=false)
Load audio for playback from an IOStream.
Definition: SDL3pp_mixer.h:4521
MIX_Audio * AudioRaw
Alias to raw representation for Audio.
Definition: SDL3pp_mixer.h:121
void DestroyMixer(MixerRaw mixer)
Free a mixer.
Definition: SDL3pp_mixer.h:4300
AudioStreamRef GetTrackAudioStream(TrackRef track)
Query the AudioStream assigned to a track.
Definition: SDL3pp_mixer.h:5775
void SetGroup(GroupRef group)
Assign a track to a mixing group.
Definition: SDL3pp_mixer.h:7166
void(SDLCALL *)(void *userdata, TrackRaw track) TrackStoppedCallback
A callback that fires when a Track is stopped.
Definition: SDL3pp_mixer.h:2156
Milliseconds FramesToMS(Sint64 frames)
Convert sample frames for a Audio's format to milliseconds.
Definition: SDL3pp_mixer.h:5943
void SetTrackRawCallback(TrackRef track, TrackMixCallback cb, void *userdata)
Set a callback that fires when a Track has initial decoded audio.
Definition: SDL3pp_mixer.h:7278
void Play(PropertiesRef options=nullptr)
Start (or restart) mixing a track for playback.
Definition: SDL3pp_mixer.h:6110
Milliseconds AudioFramesToMS(AudioRef audio, Sint64 frames)
Convert sample frames for a Audio's format to milliseconds.
Definition: SDL3pp_mixer.h:5938
TrackRef CreateTrack()
Create a new track on a mixer.
Definition: SDL3pp_mixer.h:5139
void SetTrackAudio(TrackRef track, AudioRef audio)
Set a Track's input to a Audio.
Definition: SDL3pp_mixer.h:5246
Audio LoadRawAudio(SourceBytes data, const AudioSpec &spec)
Load raw PCM data from a memory buffer.
Definition: SDL3pp_mixer.h:4832
void StopTag(MixerRef mixer, StringParam tag, Sint64 fade_out_ms)
Halt all tracks with a specific tag, possibly fading out over time.
Definition: SDL3pp_mixer.h:6349
void SetFrequencyRatio(float ratio)
Change the frequency ratio of a track.
Definition: SDL3pp_mixer.h:6829
void PauseAllTracks()
Pause all currently-playing tracks.
Definition: SDL3pp_mixer.h:6410
float GetGain()
Get a track's gain control.
Definition: SDL3pp_mixer.h:6692
PropertiesRef GetProperties()
Get the properties associated with a Audio.
Definition: SDL3pp_mixer.h:4991
void SetTagGain(StringParam tag, float gain)
Set the gain control of all tracks with a specific tag.
Definition: SDL3pp_mixer.h:6733
float GetGain()
Get a mixer's master gain control.
Definition: SDL3pp_mixer.h:6640
Sint64 MSToFrames(int sample_rate, Milliseconds ms)
Convert milliseconds to sample frames at a specific sample rate.
Definition: SDL3pp_mixer.h:5964
float GetFrequencyRatio()
Get a mixer's master frequency ratio.
Definition: SDL3pp_mixer.h:6796
constexpr Sint64 DURATION_INFINITE
Infinite duration, when the audio never runs out of sound to generate.
Definition: SDL3pp_mixer.h:5063
void SetStereo(const StereoGains &gains)
Force a track to stereo output, with optionally left/right panning.
Definition: SDL3pp_mixer.h:6950
bool ResumeTrack(TrackRef track)
Resume a currently-paused track.
Definition: SDL3pp_mixer.h:6470
void DestroyAudio(AudioRaw audio)
Destroy the specified audio.
Definition: SDL3pp_mixer.h:5111
PropertiesRef GetProperties()
Get the properties associated with a mixer.
Definition: SDL3pp_mixer.h:4326
bool StopTrack(TrackRef track, Sint64 fade_out_frames)
Halt a currently-playing track, possibly fading out over time.
Definition: SDL3pp_mixer.h:6269
void SetTrackRawIOStream(TrackRef track, IOStreamRef io, const AudioSpec &spec, bool closeio=false)
Set a Track's input to an IOStream providing raw PCM data.
Definition: SDL3pp_mixer.h:5413
bool PauseTrack(TrackRef track)
Pause a currently-playing track.
Definition: SDL3pp_mixer.h:6381
float GetTrackGain(TrackRef track)
Get a track's gain control.
Definition: SDL3pp_mixer.h:6690
void SetPostMixCallback(MixerRef mixer, PostMixCallback cb, void *userdata)
Set a callback that fires when all mixing has completed.
Definition: SDL3pp_mixer.h:7499
void Destroy()
Destroy a mixing group.
Definition: SDL3pp_mixer.h:7089
PropertiesRef GetTrackProperties(TrackRef track)
Get the properties associated with a track.
Definition: SDL3pp_mixer.h:5185
Sint64 GetRemaining()
Return the number of sample frames remaining to be mixed in a track.
Definition: SDL3pp_mixer.h:5815
void Destroy()
Destroy the specified audio decoder.
Definition: SDL3pp_mixer.h:8016
void SetAudio(AudioRef audio)
Set a Track's input to a Audio.
Definition: SDL3pp_mixer.h:5251
Audio LoadRawAudioNoCopy(SourceBytes data, const AudioSpec &spec, bool free_when_done)
Load raw PCM data from a memory buffer without making a copy.
Definition: SDL3pp_mixer.h:4886
float GetMixerGain(MixerRef mixer)
Get a mixer's master gain control.
Definition: SDL3pp_mixer.h:6638
int GetNumAudioDecoders()
Report the number of audio decoders available for use.
Definition: SDL3pp_mixer.h:4152
void SetCookedCallback(TrackMixCallback cb, void *userdata)
Set a callback that fires when the mixer has transformed a track's audio.
Definition: SDL3pp_mixer.h:7401
Sint64 GetAudioDuration(AudioRef audio)
Get the length of a Audio's playback in sample frames.
Definition: SDL3pp_mixer.h:5052
PropertiesRef GetProperties()
Get the properties associated with a track.
Definition: SDL3pp_mixer.h:5190
void StopTag(StringParam tag, Sint64 fade_out_ms)
Halt all tracks with a specific tag, possibly fading out over time.
Definition: SDL3pp_mixer.h:6354
void StopAllTracks(MixerRef mixer, Sint64 fade_out_ms)
Halt all currently-playing tracks, possibly fading out over time.
Definition: SDL3pp_mixer.h:6308
Sint64 GetTrackRemaining(TrackRef track)
Return the number of sample frames remaining to be mixed in a track.
Definition: SDL3pp_mixer.h:5810
Mixer CreateMixerDevice(AudioDeviceRef devid, const AudioSpec &spec)
Create a mixer that plays sound directly to an audio device.
Definition: SDL3pp_mixer.h:4233
void TagTrack(TrackRef track, StringParam tag)
Assign an arbitrary tag to a track.
Definition: SDL3pp_mixer.h:5455
PropertiesRef GetAudioProperties(AudioRef audio)
Get the properties associated with a Audio.
Definition: SDL3pp_mixer.h:4986
void(SDLCALL *)(void *userdata, MixerRaw mixer, const AudioSpec *spec, float *pcm, int samples) PostMixCallback
A callback that fires when all mixing has completed.
Definition: SDL3pp_mixer.h:193
Audio LoadAudio(MixerRef mixer, StringParam path, bool predecode)
Load audio for playback from a file.
Definition: SDL3pp_mixer.h:4594
void PauseAllTracks(MixerRef mixer)
Pause all currently-playing tracks.
Definition: SDL3pp_mixer.h:6405
void GetFormat(AudioSpec *spec)
Query the initial audio format of a Audio.
Definition: SDL3pp_mixer.h:5086
void GetFormat(AudioSpec *spec)
Query the initial audio format of a AudioDecoder.
Definition: SDL3pp_mixer.h:8072
void Tag(StringParam tag)
Assign an arbitrary tag to a track.
Definition: SDL3pp_mixer.h:5460
MIX_StereoGains StereoGains
A set of per-channel gains for tracks using Track.SetStereo().
Definition: SDL3pp_mixer.h:2121
int GetLoops()
Query how many loops remain for a given track.
Definition: SDL3pp_mixer.h:5687
AudioDecoder CreateAudioDecoder_IO(IOStreamRef io, bool closeio=false, PropertiesRef props=nullptr)
Create a AudioDecoder from an IOStream.
Definition: SDL3pp_mixer.h:7993
Audio LoadAudioNoCopy(MixerRef mixer, SourceBytes data, bool free_when_done)
Load audio for playback from a memory buffer without making a copy.
Definition: SDL3pp_mixer.h:4660
Audio LoadAudio_IO(IOStreamRef io, bool predecode, bool closeio=false)
Load audio for playback from an IOStream.
Definition: SDL3pp_mixer.h:4529
Sint64 AudioMSToFrames(AudioRef audio, Milliseconds ms)
Convert milliseconds to sample frames for a Audio's format.
Definition: SDL3pp_mixer.h:5906
void LockMixer(MixerRef mixer)
Lock a mixer by obtaining its internal mutex.
Definition: SDL3pp_mixer.h:4418
PropertiesRef GetMixerProperties(MixerRef mixer)
Get the properties associated with a mixer.
Definition: SDL3pp_mixer.h:4321
float GetMixerFrequencyRatio(MixerRef mixer)
Get a mixer's master frequency ratio.
Definition: SDL3pp_mixer.h:6791
void SetTrackFrequencyRatio(TrackRef track, float ratio)
Change the frequency ratio of a track.
Definition: SDL3pp_mixer.h:6824
bool Stop(Sint64 fade_out_frames)
Halt a currently-playing track, possibly fading out over time.
Definition: SDL3pp_mixer.h:6274
bool TrackPlaying(TrackRef track)
Query if a track is currently playing.
Definition: SDL3pp_mixer.h:6559
MIX_AudioDecoder * AudioDecoderRaw
Alias to raw representation for AudioDecoder.
Definition: SDL3pp_mixer.h:148
Milliseconds TrackFramesToMS(TrackRef track, Sint64 frames)
Convert sample frames for a track's current format to milliseconds.
Definition: SDL3pp_mixer.h:5877
void reset()
Unlock a mixer previously locked by a call to Mixer.Lock().
Definition: SDL3pp_mixer.h:4458
bool Paused()
Query if a track is currently paused.
Definition: SDL3pp_mixer.h:6588
AudioDecoder CreateAudioDecoder(StringParam path, PropertiesRef props=nullptr)
Create a AudioDecoder from a path on the filesystem.
Definition: SDL3pp_mixer.h:7940
Group CreateGroup(MixerRef mixer)
Create a mixing group.
Definition: SDL3pp_mixer.h:7064
Sint64 GetTrackFadeFrames(TrackRef track)
Query whether a given track is fading.
Definition: SDL3pp_mixer.h:5649
MixerLock Lock()
Lock a mixer by obtaining its internal mutex.
Definition: SDL3pp_mixer.h:4420
Audio LoadAudioNoCopy(SourceBytes data, bool free_when_done)
Load audio for playback from a memory buffer without making a copy.
Definition: SDL3pp_mixer.h:4668
PropertiesRef GetGroupProperties(GroupRef group)
Get the properties associated with a group.
Definition: SDL3pp_mixer.h:7108
void SetRawCallback(TrackMixCallback cb, void *userdata)
Set a callback that fires when a Track has initial decoded audio.
Definition: SDL3pp_mixer.h:7317
void SetMixerFrequencyRatio(MixerRef mixer, float ratio)
Set a mixer's master frequency ratio.
Definition: SDL3pp_mixer.h:6765
constexpr Sint64 DURATION_UNKNOWN
Unknown duration, when the length of the audio can't be determined.
Definition: SDL3pp_mixer.h:5060
Audio LoadRawAudioNoCopy(MixerRef mixer, SourceBytes data, const AudioSpec &spec, bool free_when_done)
Load raw PCM data from a memory buffer without making a copy.
Definition: SDL3pp_mixer.h:4877
void SetTrack3DPosition(TrackRef track, const Point3D &position)
Set a track's position in 3D space.
Definition: SDL3pp_mixer.h:6997
bool PlayAudio(MixerRef mixer, AudioRef audio)
Play a Audio from start to finish without any management.
Definition: SDL3pp_mixer.h:6227
void ResumeAllTracks(MixerRef mixer)
Resume all currently-paused tracks.
Definition: SDL3pp_mixer.h:6494
void DestroyGroup(GroupRaw group)
Destroy a mixing group.
Definition: SDL3pp_mixer.h:7087
void SetTrackGroup(TrackRef track, GroupRef group)
Assign a track to a mixing group.
Definition: SDL3pp_mixer.h:7161
Milliseconds FramesToMS(Sint64 frames)
Convert sample frames for a track's current format to milliseconds.
Definition: SDL3pp_mixer.h:5882
MixerRef GetTrackMixer(TrackRef track)
Get the Mixer that owns a Track.
Definition: SDL3pp_mixer.h:5208
Audio CreateSineWaveAudio(int hz, float amplitude, Sint64 ms)
Create a Audio that generates a sinewave.
Definition: SDL3pp_mixer.h:4938
void PlayTag(MixerRef mixer, StringParam tag, PropertiesRef options)
Start (or restart) mixing all tracks with a specific tag for playback.
Definition: SDL3pp_mixer.h:6187
void Set3DPosition(const Point3D &position)
Set a track's position in 3D space.
Definition: SDL3pp_mixer.h:7002
void SetPostMixCallback(PostMixCallback cb, void *userdata)
Set a callback that fires when all mixing has completed.
Definition: SDL3pp_mixer.h:7532
int Generate(TargetBytes buffer)
Generate mixer output when not driving an audio device.
Definition: SDL3pp_mixer.h:7599
PropertiesRef GetProperties()
Get the properties associated with a group.
Definition: SDL3pp_mixer.h:7113
MixerRef GetGroupMixer(GroupRef group)
Get the Mixer that owns a Group.
Definition: SDL3pp_mixer.h:7131
bool TrackPaused(TrackRef track)
Query if a track is currently paused.
Definition: SDL3pp_mixer.h:6586
void SetMixerGain(MixerRef mixer, float gain)
Set a mixer's master gain control.
Definition: SDL3pp_mixer.h:6615
void PlayTag(StringParam tag, PropertiesRef options)
Start (or restart) mixing all tracks with a specific tag for playback.
Definition: SDL3pp_mixer.h:6192
void GetFormat(AudioSpec *spec)
Get the audio format a mixer is generating.
Definition: SDL3pp_mixer.h:4370
void SetTrackGain(TrackRef track, float gain)
Set a track's gain control.
Definition: SDL3pp_mixer.h:6667
Audio LoadRawAudio_IO(IOStreamRef io, const AudioSpec &spec, bool closeio=false)
Load raw PCM data from an IOStream.
Definition: SDL3pp_mixer.h:4784
AudioStreamRef GetAudioStream()
Query the AudioStream assigned to a track.
Definition: SDL3pp_mixer.h:5780
int GetTrackLoops(TrackRef track)
Query how many loops remain for a given track.
Definition: SDL3pp_mixer.h:5685
Sint64 GetDuration()
Get the length of a Audio's playback in sample frames.
Definition: SDL3pp_mixer.h:5057
Sint64 MSToFrames(Milliseconds ms)
Convert milliseconds to sample frames for a Audio's format.
Definition: SDL3pp_mixer.h:5911
OwnArray< char * > GetTags()
Get the tags currently associated with a track.
Definition: SDL3pp_mixer.h:5518
void SetIOStream(IOStreamRef io, bool closeio=false)
Set a Track's input to an IOStream.
Definition: SDL3pp_mixer.h:5360
Sint64 GetTrackPlaybackPosition(TrackRef track)
Get the current input position of a playing track.
Definition: SDL3pp_mixer.h:5617
void DestroyTrack(TrackRaw track)
Destroy the specified track.
Definition: SDL3pp_mixer.h:5164
MIX_Track * TrackRaw
Alias to raw representation for Track.
Definition: SDL3pp_mixer.h:130
void SetTrackLoops(TrackRef track, int num_loops)
Change the number of times a currently-playing track will loop.
Definition: SDL3pp_mixer.h:5717
void PauseTag(StringParam tag)
Pause all tracks with a specific tag.
Definition: SDL3pp_mixer.h:6443
Point3D GetTrack3DPosition(TrackRef track)
Get a track's current position in 3D space.
Definition: SDL3pp_mixer.h:7023
MIX_Mixer * MixerRaw
Alias to raw representation for Mixer.
Definition: SDL3pp_mixer.h:112
Mixer CreateMixer(const AudioSpec &spec)
Create a mixer that generates audio to a memory buffer.
Definition: SDL3pp_mixer.h:4275
void SetLoops(int num_loops)
Change the number of times a currently-playing track will loop.
Definition: SDL3pp_mixer.h:5722
void StopAllTracks(Sint64 fade_out_ms)
Halt all currently-playing tracks, possibly fading out over time.
Definition: SDL3pp_mixer.h:6313
void GetAudioFormat(AudioRef audio, AudioSpec *spec)
Query the initial audio format of a Audio.
Definition: SDL3pp_mixer.h:5081
void(SDLCALL *)(void *userdata, GroupRaw group, const AudioSpec *spec, float *pcm, int samples) GroupMixCallback
A callback that fires when a Group has completed mixing.
Definition: SDL3pp_mixer.h:3702
PropertiesRef GetProperties()
Get the properties associated with a AudioDecoder.
Definition: SDL3pp_mixer.h:8046
OwnArray< TrackRef > GetTaggedTracks(MixerRef mixer, StringParam tag)
Get all tracks with a specific tag.
Definition: SDL3pp_mixer.h:5537
void SetOutputChannelMap(std::span< const int > chmap)
Set the current output channel map of a track.
Definition: SDL3pp_mixer.h:6910
bool Pause()
Pause a currently-playing track.
Definition: SDL3pp_mixer.h:6383
void Destroy()
Destroy the specified audio.
Definition: SDL3pp_mixer.h:5113
void ResumeTag(StringParam tag)
Resume all tracks with a specific tag.
Definition: SDL3pp_mixer.h:6531
Point3D Get3DPosition()
Get a track's current position in 3D space.
Definition: SDL3pp_mixer.h:7030
GroupRef CreateGroup()
Create a mixing group.
Definition: SDL3pp_mixer.h:7066
void SetGain(float gain)
Set a track's gain control.
Definition: SDL3pp_mixer.h:6672
void Destroy()
Destroy the specified track.
Definition: SDL3pp_mixer.h:5166
int DecodeAudio(AudioDecoderRef audiodecoder, TargetBytes buffer, const AudioSpec &spec)
Decode more audio from a AudioDecoder.
Definition: SDL3pp_mixer.h:8097
void SetAudioStream(AudioStreamRef stream)
Set a Track's input to an AudioStream.
Definition: SDL3pp_mixer.h:5301
Sint64 MSToFrames(Milliseconds ms)
Convert milliseconds to sample frames for a track's current format.
Definition: SDL3pp_mixer.h:5847
AudioRef GetTrackAudio(TrackRef track)
Query the Audio assigned to a track.
Definition: SDL3pp_mixer.h:5747
std::chrono::milliseconds Milliseconds
Duration in Miliseconds (Uint32).
Definition: SDL3pp_stdinc.h:326
::Sint64 Sint64
A signed 64-bit integer type.
Definition: SDL3pp_stdinc.h:296
Main include header for the SDL3pp library.
Sint32 narrowS32(T value)
Narrows to Sint32.
Definition: SDL3pp_stdinc.h:6425
Reference for AudioDecoder.
Definition: SDL3pp_mixer.h:7841
constexpr AudioDecoderRef(const AudioDecoder &resource) noexcept
Constructs from AudioDecoder.
Definition: SDL3pp_mixer.h:7863
~AudioDecoderRef()
Destructor.
Definition: SDL3pp_mixer.h:7893
constexpr AudioDecoderRef(AudioDecoderRaw resource) noexcept
Constructs from raw AudioDecoder.
Definition: SDL3pp_mixer.h:7851
constexpr AudioDecoderRef(AudioDecoder &&resource) noexcept
Constructs from AudioDecoder.
Definition: SDL3pp_mixer.h:7875
constexpr AudioDecoderRef(const AudioDecoderRef &other) noexcept
Copy constructor.
Definition: SDL3pp_mixer.h:7881
AudioDecoderRef & operator=(const AudioDecoderRef &other) noexcept
Assignment operator.
Definition: SDL3pp_mixer.h:7896
constexpr AudioDecoderRef(AudioDecoderRef &&other) noexcept
Move constructor.
Definition: SDL3pp_mixer.h:7887
Reference for AudioDevice.
Definition: SDL3pp_audio.h:1476
Reference for Audio.
Definition: SDL3pp_mixer.h:2039
constexpr AudioRef(AudioRef &&other) noexcept
Move constructor.
Definition: SDL3pp_mixer.h:2085
AudioRef & operator=(const AudioRef &other) noexcept
Assignment operator.
Definition: SDL3pp_mixer.h:2094
constexpr AudioRef(const Audio &resource) noexcept
Constructs from Audio.
Definition: SDL3pp_mixer.h:2061
constexpr AudioRef(AudioRaw resource) noexcept
Constructs from raw Audio.
Definition: SDL3pp_mixer.h:2049
constexpr AudioRef(const AudioRef &other) noexcept
Copy constructor.
Definition: SDL3pp_mixer.h:2079
~AudioRef()
Destructor.
Definition: SDL3pp_mixer.h:2091
constexpr AudioRef(Audio &&resource) noexcept
Constructs from Audio.
Definition: SDL3pp_mixer.h:2073
Reference for AudioStream.
Definition: SDL3pp_audio.h:2941
Reference for Group.
Definition: SDL3pp_mixer.h:3935
constexpr GroupRef(GroupRaw resource) noexcept
Constructs from raw Group.
Definition: SDL3pp_mixer.h:3945
GroupRef & operator=(const GroupRef &other) noexcept
Assignment operator.
Definition: SDL3pp_mixer.h:3990
constexpr GroupRef(GroupRef &&other) noexcept
Move constructor.
Definition: SDL3pp_mixer.h:3981
constexpr GroupRef(const Group &resource) noexcept
Constructs from Group.
Definition: SDL3pp_mixer.h:3957
~GroupRef()
Destructor.
Definition: SDL3pp_mixer.h:3987
constexpr GroupRef(const GroupRef &other) noexcept
Copy constructor.
Definition: SDL3pp_mixer.h:3975
constexpr GroupRef(Group &&resource) noexcept
Constructs from Group.
Definition: SDL3pp_mixer.h:3969
Reference for IOStream.
Definition: SDL3pp_iostream.h:1627
Definition: SDL3pp_callbackWrapper.h:169
Reference for Mixer.
Definition: SDL3pp_mixer.h:1349
constexpr MixerRef(MixerRaw resource) noexcept
Constructs from raw Mixer.
Definition: SDL3pp_mixer.h:1359
constexpr MixerRef(const MixerRef &other) noexcept
Copy constructor.
Definition: SDL3pp_mixer.h:1389
constexpr MixerRef(const Mixer &resource) noexcept
Constructs from Mixer.
Definition: SDL3pp_mixer.h:1371
constexpr MixerRef(Mixer &&resource) noexcept
Constructs from Mixer.
Definition: SDL3pp_mixer.h:1383
constexpr MixerRef(MixerRef &&other) noexcept
Move constructor.
Definition: SDL3pp_mixer.h:1395
MixerRef & operator=(const MixerRef &other) noexcept
Assignment operator.
Definition: SDL3pp_mixer.h:1404
~MixerRef()
Destructor.
Definition: SDL3pp_mixer.h:1401
Reference for Properties.
Definition: SDL3pp_properties.h:687
Reference for Track.
Definition: SDL3pp_mixer.h:3600
constexpr TrackRef(TrackRef &&other) noexcept
Move constructor.
Definition: SDL3pp_mixer.h:3646
constexpr TrackRef(TrackRaw resource) noexcept
Constructs from raw Track.
Definition: SDL3pp_mixer.h:3610
TrackRef & operator=(const TrackRef &other) noexcept
Assignment operator.
Definition: SDL3pp_mixer.h:3655
constexpr TrackRef(const Track &resource) noexcept
Constructs from Track.
Definition: SDL3pp_mixer.h:3622
~TrackRef()
Destructor.
Definition: SDL3pp_mixer.h:3652
constexpr TrackRef(const TrackRef &other) noexcept
Copy constructor.
Definition: SDL3pp_mixer.h:3640
constexpr TrackRef(Track &&resource) noexcept
Constructs from Track.
Definition: SDL3pp_mixer.h:3634