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
//! # 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 an interface for scripting audio events to
//! happen at certain times, like the tick of a metronome.
//!
//! ## Usage
//!
//! To use Kira, first create an `AudioManager`:
//! ```no_run
//! # use std::error::Error;
//! # use kira::manager::{AudioManager, AudioManagerSettings};
//! #
//! let mut audio_manager = AudioManager::<()>::new(AudioManagerSettings::default())?;
//! # Ok::<(), kira::AudioError>(())
//! ```
//!
//! All audio-related actions go through the `AudioManager`.
//!
//! ### Loading and playing a sound
//!
//! ```no_run
//! # use std::error::Error;
//! # use kira::{manager::{AudioManager, AudioManagerSettings}, sound::{Sound, SoundSettings}, instance::InstanceSettings};
//! #
//! # let mut audio_manager = AudioManager::<()>::new(AudioManagerSettings::default())?;
//! let sound_id = audio_manager.add_sound(Sound::from_file("loop.ogg", SoundSettings::default())?)?;
//! audio_manager.play_sound(sound_id, InstanceSettings::default())?;
//! # Ok::<(), kira::AudioError>(())
//! ```
//!
//! ### Looping a piece of music
//!
//! ```no_run
//! # use std::error::Error;
//! #
//! # use kira::{
//! # 	instance::InstanceSettings,
//! # 	manager::AudioManager,
//! # 	sound::{Sound, SoundMetadata, SoundSettings},
//! # 	Tempo,
//! # };
//! #
//! # let mut audio_manager = AudioManager::<()>::new(Default::default())?;
//! let sound_id = audio_manager.add_sound(Sound::from_file(
//! 	"loop.ogg",
//! 	SoundSettings {
//! 		metadata: SoundMetadata {
//! 			semantic_duration: Some(Tempo(128.0).beats_to_seconds(16.0)),
//! 		},
//! 		..Default::default()
//! 	},
//! )?)?;
//! // when the sound loops, start the loop 4 beats in
//! let loop_start = Tempo(128.0).beats_to_seconds(4.0);
//! audio_manager.play_sound(sound_id, InstanceSettings::new().loop_region(loop_start..))?;
//! # Ok::<(), kira::AudioError>(())
//! ```
//!
//! ### 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,
//! # 	sequence::Sequence,
//! # 	sound::{Sound, SoundMetadata, SoundSettings},
//! # 	Tempo,
//! # };
//! #
//! # #[derive(Debug, Copy, Clone)]
//! # enum CustomEvent {
//! # 	KickDrum,
//! # }
//! #
//! # let mut audio_manager = AudioManager::<CustomEvent>::new(Default::default())?;
//! # let kick_drum_sound_id = audio_manager.add_sound(Sound::from_file(
//! # 	"kick.ogg",
//! # 	SoundSettings {
//! # 		metadata: SoundMetadata {
//! # 			semantic_duration: Some(Tempo(128.0).beats_to_seconds(16.0)),
//! # 		},
//! # 		..Default::default()
//! # 	},
//! # )?)?;
//! let mut sequence = Sequence::new();
//! sequence.start_loop();
//! sequence.wait_for_interval(4.0);
//! sequence.play_sound(kick_drum_sound_id, InstanceSettings::default());
//! sequence.emit_custom_event(CustomEvent::KickDrum);
//! audio_manager.start_sequence(sequence)?;
//! // start the metronome so the sequence will have a pulse to listen for
//! audio_manager.start_metronome()?;
//! # Ok::<(), kira::AudioError>(())
//! ```

mod command;
mod duration;
mod error;
mod event;
pub mod instance;
pub mod manager;
mod metronome;
pub mod mixer;
pub mod parameter;
pub mod sequence;
pub mod sound;
mod stereo_sample;
mod tempo;
mod value;

pub use duration::Duration;
pub use error::{AudioError, AudioResult};
pub use event::Event;
pub use metronome::MetronomeSettings;
pub use stereo_sample::StereoSample;
pub use tempo::Tempo;
pub use value::{CachedValue, Value};