11 Commits

Author SHA1 Message Date
982f1f0f21 take todo out of readme 2020-10-27 15:15:09 +00:00
459f1705c0 use tar.gz to preserve permissions 2020-10-27 15:13:00 +00:00
d46e1f48e2 +x 2020-10-27 08:08:11 +00:00
4f821fccd5 change styling 2020-10-27 08:08:03 +00:00
4f58c1eece update sounds todo 2020-10-20 22:23:25 +01:00
e3087bfa63 add repository field 2020-10-20 22:18:55 +01:00
3255fe5d47 version bump 2020-10-20 21:54:08 +01:00
ae81570c07 alphabetical order 2020-10-20 21:36:55 +01:00
6e203c3fbd added sound 2020-10-20 21:33:15 +01:00
0afc497f78 better error popup 2020-10-04 12:28:28 +01:00
b281f8af00 target-specific file manager 2020-10-03 13:17:20 +01:00
7 changed files with 71 additions and 60 deletions

View File

@@ -1,14 +1,16 @@
[package] [package]
name = "lull" name = "lull"
description = "a looping sound player for generating aural atmospheres" description = "a looping sound player for generating atmospheric soundscapes"
version = "1.0.0" version = "1.0.1"
authors = ["Max Bradbury <max@tinybird.info>"] authors = ["Max Bradbury <max@tinybird.info>"]
repository = "https://tinybird.dev/max/lull"
license = "MIT" license = "MIT"
edition = "2018" edition = "2018"
crate_type = "bin" crate_type = "bin"
[dependencies] [dependencies]
dirs = "^3.0.1" dirs = "^3.0.1"
gdk = "^0.13.2"
gio = "^0" gio = "^0"
gtk = "^0" gtk = "^0"
rodio = "^0.11.0" rodio = "^0.11.0"

View File

@@ -8,20 +8,3 @@ add your own favourite noises and blend them to create your ideal ambience.
created by [Max Bradbury](mailto:max@tinybird.info). created by [Max Bradbury](mailto:max@tinybird.info).
released under the MIT license. released under the MIT license.
## to do
* save volume preferences to disk
* cross-compile to Windows?
* watch data dir for new sounds?
* disown file manager subcommand
* get some good nature sounds
* rain on tin roof
* wind
* tape hiss
* vinyl crackle
* white noise?
* fan
* birdsong
* set a window icon
* create a nice icon?

View File

@@ -17,3 +17,5 @@ you can skip/remove any unwanted sounds, and add your own.
*campfire* by [sagetyrtle](https://freesound.org/people/sagetyrtle/) *campfire* by [sagetyrtle](https://freesound.org/people/sagetyrtle/)
*rain on glass* by [Benboncan](https://freesound.org/people/Benboncan/) *rain on glass* by [Benboncan](https://freesound.org/people/Benboncan/)
*birdsong* by [reinsamba](https://freesound.org/people/reinsamba/)

14
TODO.md Normal file
View File

@@ -0,0 +1,14 @@
# to do
* save volume preferences to disk
* cross-compile to Windows?
* watch data dir for new sounds?
* disown file manager subcommand
* get some good nature sounds
* wind
* tape hiss
* vinyl crackle
* white noise?
* fan
* set a window icon
* create a nice icon?

View File

@@ -3,7 +3,8 @@
cargo build --release cargo build --release
cp target/release/lull . cp target/release/lull .
strip lull strip lull
zip -r lull.zip README.md lull rm lull-linux.tar.gz
tar -czvf lull-linux.tar.gz lull README.md
rm lull rm lull
zip -r sounds.zip SOUNDS.md sounds/*.mp3 zip -r sounds.zip SOUNDS.md sounds/*.mp3

2
deploy.sh Normal file → Executable file
View File

@@ -1,4 +1,4 @@
#!/usr/bin/env bash #!/usr/bin/env bash
butler push lull.zip ruin/lull:linux butler push lull-linux.tar.gz ruin/lull:linux
butler push sounds.zip ruin/lull:sounds butler push sounds.zip ruin/lull:sounds

View File

@@ -12,27 +12,29 @@ use std::process::Command;
const SPACING: i32 = 16; const SPACING: i32 = 16;
#[cfg(target_os = "windows")]
fn file_manager() -> &'static str {
"explorer"
}
#[cfg(not(target_os = "windows"))]
fn file_manager() -> &'static str {
"xdg-open"
}
fn error_popup(message: &str) { fn error_popup(message: &str) {
let popup = gtk::Window::new(gtk::WindowType::Toplevel); let popup = gtk::Window::new(gtk::WindowType::Toplevel);
popup.set_title("error"); popup.set_title("error");
popup.set_border_width(SPACING as u32); popup.set_border_width(SPACING as u32);
popup.set_position(gtk::WindowPosition::Center); popup.set_position(gtk::WindowPosition::Center);
popup.set_default_size(256, 64); popup.set_default_size(256, 64);
popup.set_type_hint(gdk::WindowTypeHint::Dialog);
let vertical = gtk::Box::new(Orientation::Vertical, SPACING); popup.set_resizable(false);
popup.add(&vertical);
let message = gtk::Label::new(Some(message)); let message = gtk::Label::new(Some(message));
vertical.add(&message); popup.add(&message);
let button_ok = gtk::Button::with_label("OK");
vertical.add(&button_ok);
popup.show_all(); popup.show_all();
button_ok.connect_clicked(move |_| unsafe {
popup.destroy();
});
} }
fn get_data_dir() -> PathBuf { fn get_data_dir() -> PathBuf {
@@ -53,20 +55,45 @@ fn build_ui(application: &gtk::Application) {
window.set_title("lull"); window.set_title("lull");
window.set_border_width(SPACING as u32); window.set_border_width(SPACING as u32);
window.set_position(gtk::WindowPosition::Center); window.set_position(gtk::WindowPosition::Center);
window.set_default_size(256, 256); window.set_default_size(256, 128);
let vertical = gtk::Box::new(Orientation::Vertical, SPACING); let button_manage_sounds = gtk::Button::with_label("manage sounds");
vertical.set_homogeneous(true);
window.add(&vertical); button_manage_sounds.connect_clicked(|_| {
let mut file_manager = Command::new(file_manager());
file_manager.arg(get_data_dir());
file_manager.output().unwrap();
});
let sounds_manage = gtk::Box::new(Orientation::Vertical, SPACING);
let columns = gtk::Box::new(Orientation::Horizontal, SPACING);
let column_labels = gtk::Box::new(Orientation::Vertical, SPACING);
let column_sliders = gtk::Box::new(Orientation::Vertical, SPACING);
columns.set_homogeneous(false);
column_labels.set_homogeneous(true);
column_sliders.set_homogeneous(true);
column_labels.set_property_expand(false);
column_sliders.set_property_expand(true);
column_sliders.set_property_width_request(128);
window.add(&sounds_manage);
sounds_manage.add(&columns);
sounds_manage.add(&button_manage_sounds);
columns.add(&column_labels);
columns.add(&column_sliders);
let device = rodio::default_output_device().unwrap(); let device = rodio::default_output_device().unwrap();
let paths = std::fs::read_dir(get_data_dir()) let mut paths = std::fs::read_dir(get_data_dir())
.expect("Couldn't read from lull data directory"); .expect("Couldn't read lull sounds directory")
.map(|res| res.map(|e| e.path()))
.collect::<Result<Vec<_>, std::io::Error>>()
.expect("Couldn't read files from lull sounds directory");
paths.sort();
for path in paths { for path in paths {
let path = path.unwrap().path();
let name: &str = path.file_stem().unwrap().to_str().unwrap(); let name: &str = path.file_stem().unwrap().to_str().unwrap();
let file = File::open(&path) let file = File::open(&path)
@@ -91,11 +118,9 @@ fn build_ui(application: &gtk::Application) {
sink.append(source); sink.append(source);
sink.pause(); sink.pause();
let row = gtk::Box::new(Orientation::Horizontal, SPACING);
row.set_homogeneous(true);
let label = gtk::Label::new(Some(name)); let label = gtk::Label::new(Some(name));
row.add(&label); label.set_halign(gtk::Align::End);
column_labels.add(&label);
let adjustment = gtk::Adjustment::new( let adjustment = gtk::Adjustment::new(
0.0, 0.0,
@@ -124,25 +149,9 @@ fn build_ui(application: &gtk::Application) {
} }
}); });
row.add(&slider); column_sliders.add(&slider);
vertical.add(&row);
} }
let row_add = gtk::Box::new(Orientation::Horizontal, SPACING);
row_add.set_homogeneous(true);
let button_manage_sounds = gtk::Button::with_label("manage sounds");
button_manage_sounds.connect_clicked(|_| {
let mut file_manager = Command::new("xdg-open");
file_manager.arg(get_data_dir());
file_manager.output().unwrap();
});
row_add.add(&button_manage_sounds);
vertical.add(&row_add);
window.show_all(); window.show_all();
} }