1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
//! # Kira
//!
//! Kira is an audio library designed to help create expressive audio
//! for games. Besides the common features you'd expect from an audio
//! library, it provides interfaces for scripting audio events,
//! seamlessly looping complex pieces of music, smoothly changing
//! parameters, and more.
//!
//! ## Usage
//!
//! To use Kira, first create an [`AudioManager`](manager::AudioManager):
//! ```no_run
//! # use std::error::Error;
//! #
//! # use kira::manager::{AudioManager, AudioManagerSettings};
//! #
//! let mut audio_manager = AudioManager::new(AudioManagerSettings::default())?;
//! # Ok::<(), Box<dyn std::error::Error>>(())
//! ```
//!
//! All audio-related actions go through the [`AudioManager`](manager::AudioManager).
//!
//! ### Loading and playing a sound
//!
//! ```no_run
//! # use std::error::Error;
//! #
//! # use kira::{
//! # 	instance::InstanceSettings,
//! # 	manager::{AudioManager, AudioManagerSettings},
//! # 	sound::SoundSettings,
//! # };
//! #
//! # let mut audio_manager = AudioManager::new(AudioManagerSettings::default())?;
//! let mut sound_handle = audio_manager.load_sound("sound.ogg", SoundSettings::default())?;
//! sound_handle.play(InstanceSettings::default())?;
//! # Ok::<(), Box<dyn std::error::Error>>(())
//! ```
//!
//! ### Looping a song while preserving trailing sounds
//!
//! ```no_run
//! # use std::error::Error;
//! #
//! # use kira::{
//! # 	arrangement::{Arrangement, LoopArrangementSettings},
//! # 	instance::InstanceSettings,
//! # 	manager::{AudioManager, AudioManagerSettings},
//! # 	sound::SoundSettings,
//! # 	Tempo,
//! # };
//! #
//! # let mut audio_manager = AudioManager::new(AudioManagerSettings::default())?;
//! let sound_handle = audio_manager.load_sound(
//! 	"loop.ogg",
//! 	SoundSettings::new().semantic_duration(Tempo(128.0).beats_to_seconds(8.0)),
//! )?;
//! let mut arrangement_handle = audio_manager.add_arrangement(Arrangement::new_loop(
//! 	&sound_handle,
//! 	LoopArrangementSettings::default(),
//! ))?;
//! arrangement_handle.play(InstanceSettings::default())?;
//! # Ok::<(), Box<dyn std::error::Error>>(())
//! ```
//!
//! ### Scripting audio sequences
//!
//! This example will play a kick drum sound every 4 beats and emit an event
//! each time:
//!
//! ```no_run
//! # use std::error::Error;
//! #
//! # use kira::{
//! # 	instance::InstanceSettings,
//! # 	manager::{AudioManager, AudioManagerSettings},
//! # 	metronome::MetronomeSettings,
//! # 	sequence::{Sequence, SequenceInstanceSettings, SequenceSettings},
//! # 	sound::SoundSettings,
//! # 	Tempo,
//! # };
//! #
//! #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
//! enum CustomEvent {
//! 	Kick,
//! }
//!
//! # let mut audio_manager = AudioManager::new(AudioManagerSettings::default())?;
//! let kick_sound_handle = audio_manager.load_sound("kick.wav", SoundSettings::default())?;
//! let mut metronome_handle =
//! 	audio_manager.add_metronome(MetronomeSettings::new().tempo(Tempo(150.0)))?;
//! audio_manager.start_sequence(
//! 	{
//! 		let mut sequence = Sequence::new(SequenceSettings::default());
//! 		sequence.start_loop();
//! 		sequence.play(&kick_sound_handle, InstanceSettings::default());
//! 		sequence.emit(CustomEvent::Kick);
//! 		sequence.wait(kira::Duration::Beats(1.0));
//! 		sequence
//! 	},
//! 	SequenceInstanceSettings::new().metronome(&metronome_handle),
//! )?;
//! metronome_handle.start()?;
//! # Ok::<(), Box<dyn std::error::Error>>(())
//! ```

#![warn(missing_docs)]

pub mod arrangement;
pub mod audio_stream;
mod command;
mod duration;
mod frame;
pub mod group;
pub mod instance;
pub mod manager;
pub mod metronome;
pub mod mixer;
pub mod parameter;
mod playable;
pub mod sequence;
pub mod sound;
mod static_container;
mod tempo;
mod util;
mod value;

pub use command::producer::CommandError;
pub use duration::Duration;
pub use frame::Frame;
pub use playable::PlayableId;
pub use tempo::Tempo;
pub use value::{CachedValue, Value};