From d70dcb4f20d1c52add759ed4ec5ccbf7131de069 Mon Sep 17 00:00:00 2001 From: Sebastian Reichel Date: Sat, 6 Oct 2012 21:09:54 +0200 Subject: Add full audio support (Closes: GH-13) --- sounds/user/beep/LICENSE | 24 ++++++++++++ sounds/user/beep/error/buzzer.ogg | Bin 0 -> 27153 bytes sounds/user/beep/login/toycaralarm.ogg | Bin 0 -> 8737 bytes sounds/user/beep/logout/cha ching.ogg | Bin 0 -> 31476 bytes sounds/user/beep/purchase/beep.ogg | Bin 0 -> 5665 bytes sounds/user/beep/purchase/camera.ogg | Bin 0 -> 14605 bytes sounds/user/dude/LICENSE | 19 ++++++++++ sounds/user/dude/error/I broke something.ogg | Bin 0 -> 76434 bytes sounds/user/dude/login/hey dude, whats up man.ogg | Bin 0 -> 57447 bytes sounds/user/dude/logout/bye.ogg | Bin 0 -> 27610 bytes sounds/user/dude/purchase/yeah man.ogg | Bin 0 -> 38743 bytes sounds/user/girlfriend/LICENSE | 39 ++++++++++++++++++++ sounds/user/girlfriend/error/no, no, forget it.ogg | Bin 0 -> 26872 bytes sounds/user/girlfriend/login/hello.ogg | Bin 0 -> 9918 bytes .../login/we need to talk about this.ogg | Bin 0 -> 37918 bytes .../girlfriend/logout/get out, get outta here.ogg | Bin 0 -> 29444 bytes .../logout/i dont have time for this.ogg | Bin 0 -> 34138 bytes .../logout/why dont you just leave then.ogg | Bin 0 -> 35918 bytes sounds/user/girlfriend/purchase/code accepted.ogg | Bin 0 -> 17678 bytes sounds/user/girlfriend/purchase/yeah so what.ogg | Bin 0 -> 25896 bytes sounds/user/robot/LICENSE | 19 ++++++++++ sounds/user/robot/error/critical error.ogg | Bin 0 -> 21345 bytes sounds/user/robot/login/login accepted.ogg | Bin 0 -> 32165 bytes sounds/user/robot/logout/terminating.ogg | Bin 0 -> 18148 bytes sounds/user/robot/purchase/accepted.ogg | Bin 0 -> 16324 bytes sounds/user/sexy/LICENSE | 39 ++++++++++++++++++++ sounds/user/sexy/error/error.ogg | Bin 0 -> 15582 bytes sounds/user/sexy/login/welcome back sexy bitch.ogg | Bin 0 -> 56041 bytes .../sexy/logout/well if thats how you feel.ogg | Bin 0 -> 36308 bytes sounds/user/sexy/logout/what about me.ogg | Bin 0 -> 26986 bytes sounds/user/sexy/purchase/do it again.ogg | Bin 0 -> 65485 bytes sounds/user/sexy/purchase/what is next.ogg | Bin 0 -> 19297 bytes sounds/user/sexy/purchase/yes, master.ogg | Bin 0 -> 24812 bytes .../user/sexy/purchase/your will is my command.ogg | Bin 0 -> 41467 bytes src/audio.vala | 41 ++++++++++++++++++++- src/main.vala | 5 ++- src/scannersession.vala | 36 ++++++++++++------ 37 files changed, 206 insertions(+), 16 deletions(-) create mode 100644 sounds/user/beep/LICENSE create mode 100644 sounds/user/beep/error/buzzer.ogg create mode 100644 sounds/user/beep/login/toycaralarm.ogg create mode 100644 sounds/user/beep/logout/cha ching.ogg create mode 100644 sounds/user/beep/purchase/beep.ogg create mode 100644 sounds/user/beep/purchase/camera.ogg create mode 100644 sounds/user/dude/LICENSE create mode 100644 sounds/user/dude/error/I broke something.ogg create mode 100644 sounds/user/dude/login/hey dude, whats up man.ogg create mode 100644 sounds/user/dude/logout/bye.ogg create mode 100644 sounds/user/dude/purchase/yeah man.ogg create mode 100644 sounds/user/girlfriend/LICENSE create mode 100644 sounds/user/girlfriend/error/no, no, forget it.ogg create mode 100644 sounds/user/girlfriend/login/hello.ogg create mode 100644 sounds/user/girlfriend/login/we need to talk about this.ogg create mode 100644 sounds/user/girlfriend/logout/get out, get outta here.ogg create mode 100644 sounds/user/girlfriend/logout/i dont have time for this.ogg create mode 100644 sounds/user/girlfriend/logout/why dont you just leave then.ogg create mode 100644 sounds/user/girlfriend/purchase/code accepted.ogg create mode 100644 sounds/user/girlfriend/purchase/yeah so what.ogg create mode 100644 sounds/user/robot/LICENSE create mode 100644 sounds/user/robot/error/critical error.ogg create mode 100644 sounds/user/robot/login/login accepted.ogg create mode 100644 sounds/user/robot/logout/terminating.ogg create mode 100644 sounds/user/robot/purchase/accepted.ogg create mode 100644 sounds/user/sexy/LICENSE create mode 100644 sounds/user/sexy/error/error.ogg create mode 100644 sounds/user/sexy/login/welcome back sexy bitch.ogg create mode 100644 sounds/user/sexy/logout/well if thats how you feel.ogg create mode 100644 sounds/user/sexy/logout/what about me.ogg create mode 100644 sounds/user/sexy/purchase/do it again.ogg create mode 100644 sounds/user/sexy/purchase/what is next.ogg create mode 100644 sounds/user/sexy/purchase/yes, master.ogg create mode 100644 sounds/user/sexy/purchase/your will is my command.ogg diff --git a/sounds/user/beep/LICENSE b/sounds/user/beep/LICENSE new file mode 100644 index 0000000..a0acd3d --- /dev/null +++ b/sounds/user/beep/LICENSE @@ -0,0 +1,24 @@ +Files: error/buzzer.ogg +Source: http://www.freesound.org/people/guitarguy1985/sounds/54047/ +Copyright: 2008, guitarguy1985 +License: CC-0 + +Files: login/toycaralarm.ogg +Source: http://www.freesound.org/people/AMPUL/sounds/29723/ +Copyright: 2007, AMPUL +License: Sampling+ + +Files: logout/cha ching.ogg +Source: http://www.freesound.org/people/creek23/sounds/75235/ +Copyright: 2009, creek23 +License: CC-BY-3.0 + +Files: purchase/camera.ogg +Source: http://www.freesound.org/people/FreqMan/sounds/42899/ +Copyright: 2007, FreqMan +License: CC-BY-3.0 + +Files: purchase/beep.ogg +Source: http://www.freesound.org/people/KorgMS2000B/sounds/54415/ +Copyright: 2008, KorgMS2000B +License: Sampling+ diff --git a/sounds/user/beep/error/buzzer.ogg b/sounds/user/beep/error/buzzer.ogg new file mode 100644 index 0000000..eebd2fa Binary files /dev/null and b/sounds/user/beep/error/buzzer.ogg differ diff --git a/sounds/user/beep/login/toycaralarm.ogg b/sounds/user/beep/login/toycaralarm.ogg new file mode 100644 index 0000000..817a4c9 Binary files /dev/null and b/sounds/user/beep/login/toycaralarm.ogg differ diff --git a/sounds/user/beep/logout/cha ching.ogg b/sounds/user/beep/logout/cha ching.ogg new file mode 100644 index 0000000..4c6d88d Binary files /dev/null and b/sounds/user/beep/logout/cha ching.ogg differ diff --git a/sounds/user/beep/purchase/beep.ogg b/sounds/user/beep/purchase/beep.ogg new file mode 100644 index 0000000..e3dbad4 Binary files /dev/null and b/sounds/user/beep/purchase/beep.ogg differ diff --git a/sounds/user/beep/purchase/camera.ogg b/sounds/user/beep/purchase/camera.ogg new file mode 100644 index 0000000..41373d4 Binary files /dev/null and b/sounds/user/beep/purchase/camera.ogg differ diff --git a/sounds/user/dude/LICENSE b/sounds/user/dude/LICENSE new file mode 100644 index 0000000..3b65ddd --- /dev/null +++ b/sounds/user/dude/LICENSE @@ -0,0 +1,19 @@ +Files: error/I broke something.ogg +Source: http://www.freesound.org/people/ecfike/sounds/154574/ +Copyright: ecfike +License: CC-0 + +Files: login/hey dude, whats up man.ogg +Source: http://www.freesound.org/people/ecfike/sounds/154619/ +Copyright: ecfike +License: CC-0 + +Files: logout/bye.ogg +Source: http://www.freesound.org/people/ecfike/sounds/154546/ +Copyright: ecfike +License: CC-0 + +Files: purchase/yeah man.ogg +Source: http://www.freesound.org/people/ecfike/sounds/154582/ +Copyright: ecfike +License: CC-0 diff --git a/sounds/user/dude/error/I broke something.ogg b/sounds/user/dude/error/I broke something.ogg new file mode 100644 index 0000000..ae8c298 Binary files /dev/null and b/sounds/user/dude/error/I broke something.ogg differ diff --git a/sounds/user/dude/login/hey dude, whats up man.ogg b/sounds/user/dude/login/hey dude, whats up man.ogg new file mode 100644 index 0000000..8b6d7b5 Binary files /dev/null and b/sounds/user/dude/login/hey dude, whats up man.ogg differ diff --git a/sounds/user/dude/logout/bye.ogg b/sounds/user/dude/logout/bye.ogg new file mode 100644 index 0000000..de62d3b Binary files /dev/null and b/sounds/user/dude/logout/bye.ogg differ diff --git a/sounds/user/dude/purchase/yeah man.ogg b/sounds/user/dude/purchase/yeah man.ogg new file mode 100644 index 0000000..b3c2d09 Binary files /dev/null and b/sounds/user/dude/purchase/yeah man.ogg differ diff --git a/sounds/user/girlfriend/LICENSE b/sounds/user/girlfriend/LICENSE new file mode 100644 index 0000000..9153012 --- /dev/null +++ b/sounds/user/girlfriend/LICENSE @@ -0,0 +1,39 @@ +Files: error/no, no, forget it.ogg +Source: http://www.freesound.org/people/epanody/sounds/86427/ +Copyright: 2009, epanody +License: CC-BY-3.0 + +Files: login/hello.ogg +Source: http://www.freesound.org/people/epanody/sounds/97830/ +Copyright: 2010, epanody +License: CC-BY-3.0 + +Files: login/we need to talk about this.ogg +Source: http://www.freesound.org/people/epanody/sounds/86454/ +Copyright: 2009, epanody +License: CC-BY-3.0 + +Files: logout/get out, get outta here.ogg +Source: http://www.freesound.org/people/epanody/sounds/86409/ +Copyrigt: 2009, epanody +License: CC-BY-3.0 + +Files: logout/why dont you just leave then.ogg +Source: http://www.freesound.org/people/epanody/sounds/86463/ +Copyrigt: 2009, epanody +License: CC-BY-3.0 + +Files: logout/i dont have time for this.ogg +Source: http://www.freesound.org/people/epanody/sounds/86386/ +Copyrigt: 2009, epanody +License: CC-BY-3.0 + +Files: purchase/code accepted.ogg +Source: http://www.freesound.org/people/epanody/sounds/97827/ +Copyright: 2010, epanody +License: CC-BY-3.0 + +Files: purchase/yeah so what.ogg +Source: http://www.freesound.org/people/epanody/sounds/86468/ +Copyright: 2010, epanody +License: CC-BY-3.0 diff --git a/sounds/user/girlfriend/error/no, no, forget it.ogg b/sounds/user/girlfriend/error/no, no, forget it.ogg new file mode 100644 index 0000000..825f24b Binary files /dev/null and b/sounds/user/girlfriend/error/no, no, forget it.ogg differ diff --git a/sounds/user/girlfriend/login/hello.ogg b/sounds/user/girlfriend/login/hello.ogg new file mode 100644 index 0000000..7c76e4d Binary files /dev/null and b/sounds/user/girlfriend/login/hello.ogg differ diff --git a/sounds/user/girlfriend/login/we need to talk about this.ogg b/sounds/user/girlfriend/login/we need to talk about this.ogg new file mode 100644 index 0000000..2df048f Binary files /dev/null and b/sounds/user/girlfriend/login/we need to talk about this.ogg differ diff --git a/sounds/user/girlfriend/logout/get out, get outta here.ogg b/sounds/user/girlfriend/logout/get out, get outta here.ogg new file mode 100644 index 0000000..c305d26 Binary files /dev/null and b/sounds/user/girlfriend/logout/get out, get outta here.ogg differ diff --git a/sounds/user/girlfriend/logout/i dont have time for this.ogg b/sounds/user/girlfriend/logout/i dont have time for this.ogg new file mode 100644 index 0000000..77b0fce Binary files /dev/null and b/sounds/user/girlfriend/logout/i dont have time for this.ogg differ diff --git a/sounds/user/girlfriend/logout/why dont you just leave then.ogg b/sounds/user/girlfriend/logout/why dont you just leave then.ogg new file mode 100644 index 0000000..eac83c8 Binary files /dev/null and b/sounds/user/girlfriend/logout/why dont you just leave then.ogg differ diff --git a/sounds/user/girlfriend/purchase/code accepted.ogg b/sounds/user/girlfriend/purchase/code accepted.ogg new file mode 100644 index 0000000..34dc3d4 Binary files /dev/null and b/sounds/user/girlfriend/purchase/code accepted.ogg differ diff --git a/sounds/user/girlfriend/purchase/yeah so what.ogg b/sounds/user/girlfriend/purchase/yeah so what.ogg new file mode 100644 index 0000000..c488a26 Binary files /dev/null and b/sounds/user/girlfriend/purchase/yeah so what.ogg differ diff --git a/sounds/user/robot/LICENSE b/sounds/user/robot/LICENSE new file mode 100644 index 0000000..ac119af --- /dev/null +++ b/sounds/user/robot/LICENSE @@ -0,0 +1,19 @@ +Files: error/critical error.ogg +Source: http://www.freesound.org/people/liquidhot/sounds/23514/ +Copyright: 2009, liquidhot +License: CC-BY-3.0 + +Files: login/login accepted.ogg +Source: http://www.freesound.org/people/liquidhot/sounds/23516/ +Copyright: 2006, liquidhot +License: CC-BY-3.0 + +Files: logout/terminating.ogg +Source: http://www.freesound.org/people/liquidhot/sounds/23513/ +Copyright: 2006, liquidhot +License: CC-BY-3.0 + +Files: purchase/code accepted.ogg +Source: http://www.freesound.org/people/epanody/sounds/97827/ +Copyright: 2010, epanody +License: CC-BY-3.0 diff --git a/sounds/user/robot/error/critical error.ogg b/sounds/user/robot/error/critical error.ogg new file mode 100644 index 0000000..f3abfcd Binary files /dev/null and b/sounds/user/robot/error/critical error.ogg differ diff --git a/sounds/user/robot/login/login accepted.ogg b/sounds/user/robot/login/login accepted.ogg new file mode 100644 index 0000000..90e0e48 Binary files /dev/null and b/sounds/user/robot/login/login accepted.ogg differ diff --git a/sounds/user/robot/logout/terminating.ogg b/sounds/user/robot/logout/terminating.ogg new file mode 100644 index 0000000..dccb6d6 Binary files /dev/null and b/sounds/user/robot/logout/terminating.ogg differ diff --git a/sounds/user/robot/purchase/accepted.ogg b/sounds/user/robot/purchase/accepted.ogg new file mode 100644 index 0000000..b980230 Binary files /dev/null and b/sounds/user/robot/purchase/accepted.ogg differ diff --git a/sounds/user/sexy/LICENSE b/sounds/user/sexy/LICENSE new file mode 100644 index 0000000..99238dc --- /dev/null +++ b/sounds/user/sexy/LICENSE @@ -0,0 +1,39 @@ +Files: error/error.ogg +Source: http://www.freesound.org/people/Corsica_S/sounds/56097/ +Copyright: 2008, Corsica_S +License: CC-BY-3.0 + +Files: login/welcome back sexy bitch.ogg +Source: http://www.freesound.org/people/Corsica_S/sounds/99889/ +Copyright: 2010, Corsica_S +License: CC-BY-3.0 + +Files: logout/what about me.ogg +Source: http://www.freesound.org/people/epanody/sounds/86457/ +Copyright: 2010, Corsica_S +License: CC-BY-3.0 + +Files: logout/well if thats how you feel.ogg +Source: http://www.freesound.org/people/epanody/sounds/86456/ +Copyright: 2010, Corsica_S +License: CC-BY-3.0 + +Files: purchase/yes, master.ogg +Source: http://www.freesound.org/people/Corsica_S/sounds/107555/ +Copyright: 2010, Corsica_S +License: CC-BY-3.0 + +Files: purchase/your will is my command.ogg +Source: http://www.freesound.org/people/Corsica_S/sounds/107556/ +Copyright: 2012, Corsica_S +License: CC-BY-3.0 + +Files: purchase/do it again.ogg +Source: http://www.freesound.org/people/Corsica_S/sounds/95235/ +Copyright: 2010, Corsica_S +License: CC-BY-3.0 + +Files: purchase/what is next.ogg +Source: http://www.freesound.org/people/Corsica_S/sounds/72257/ +Copyright: 2009, Corsica_S +License: CC-BY-3.0 diff --git a/sounds/user/sexy/error/error.ogg b/sounds/user/sexy/error/error.ogg new file mode 100644 index 0000000..bd0f41d Binary files /dev/null and b/sounds/user/sexy/error/error.ogg differ diff --git a/sounds/user/sexy/login/welcome back sexy bitch.ogg b/sounds/user/sexy/login/welcome back sexy bitch.ogg new file mode 100644 index 0000000..77fc7ac Binary files /dev/null and b/sounds/user/sexy/login/welcome back sexy bitch.ogg differ diff --git a/sounds/user/sexy/logout/well if thats how you feel.ogg b/sounds/user/sexy/logout/well if thats how you feel.ogg new file mode 100644 index 0000000..30fb42c Binary files /dev/null and b/sounds/user/sexy/logout/well if thats how you feel.ogg differ diff --git a/sounds/user/sexy/logout/what about me.ogg b/sounds/user/sexy/logout/what about me.ogg new file mode 100644 index 0000000..9ed10db Binary files /dev/null and b/sounds/user/sexy/logout/what about me.ogg differ diff --git a/sounds/user/sexy/purchase/do it again.ogg b/sounds/user/sexy/purchase/do it again.ogg new file mode 100644 index 0000000..6465c60 Binary files /dev/null and b/sounds/user/sexy/purchase/do it again.ogg differ diff --git a/sounds/user/sexy/purchase/what is next.ogg b/sounds/user/sexy/purchase/what is next.ogg new file mode 100644 index 0000000..e3d3927 Binary files /dev/null and b/sounds/user/sexy/purchase/what is next.ogg differ diff --git a/sounds/user/sexy/purchase/yes, master.ogg b/sounds/user/sexy/purchase/yes, master.ogg new file mode 100644 index 0000000..f0723a1 Binary files /dev/null and b/sounds/user/sexy/purchase/yes, master.ogg differ diff --git a/sounds/user/sexy/purchase/your will is my command.ogg b/sounds/user/sexy/purchase/your will is my command.ogg new file mode 100644 index 0000000..3f07616 Binary files /dev/null and b/sounds/user/sexy/purchase/your will is my command.ogg differ diff --git a/src/audio.vala b/src/audio.vala index e30f3b1..eeff7b1 100644 --- a/src/audio.vala +++ b/src/audio.vala @@ -15,6 +15,7 @@ public class AudioPlayer { private dynamic Gst.Element p; + string path; public signal void end_of_stream(); @@ -29,13 +30,49 @@ public class AudioPlayer { } public AudioPlayer() { + path = Environment.get_current_dir()+"/sounds/"; p = Gst.ElementFactory.make("playbin", "play"); p.get_bus().add_watch(bus_callback); } - public void play(string file) { + public void play_system(string file) { p.set_state(Gst.State.NULL); - p.uri = "file://"+Environment.get_current_dir()+"/sounds/"+file; + p.uri = "file://" + path + "system/"+file; + p.set_state(Gst.State.PLAYING); + } + + private string[] get_files(string dir) { + try { + var directory = File.new_for_path(dir); + var enumerator = directory.enumerate_children(FileAttribute.STANDARD_NAME, 0); + string[] result = {}; + + FileInfo file_info; + while ((file_info = enumerator.next_file ()) != null) { + result += file_info.get_name(); + } + + return result; + } catch (Error e) { + write_to_log("Error: %s\n", e.message); + return {}; + } + } + + private string get_random_file(string dir) { + var files = get_files(dir); + var index = Random.int_range(0, files.length); + return files[index]; + } + + public string get_random_user_theme() { + return get_random_file(path + "user/"); + } + + public void play_user(string theme, string type) { + p.set_state(Gst.State.NULL); + var file = get_random_file(path + "user/" + theme+ "/" + type); + p.uri = "file://" + path + "user/" + theme+ "/" + type + "/" + file; p.set_state(Gst.State.PLAYING); } } diff --git a/src/main.vala b/src/main.vala index aadafe7..7f9d3c1 100644 --- a/src/main.vala +++ b/src/main.vala @@ -62,6 +62,7 @@ public static int main(string[] args) { db = new Database("shop.db"); audio = new AudioPlayer(); loop = new MainLoop(); + localsession = new ScannerSession(); dev.received_barcode.connect((data) => { if(localsession.interpret(data)) @@ -69,7 +70,7 @@ public static int main(string[] args) { }); write_to_log("KtT Shop System has been started"); - audio.play("system/startup.ogg"); + audio.play_system("startup.ogg"); /* attach webserver to mainloop */ new WebServer(); @@ -78,7 +79,7 @@ public static int main(string[] args) { loop.run(); write_to_log("Stopping Shop System"); - audio.play("system/shutdown.ogg"); + audio.play_system("shutdown.ogg"); /* we need to run the mainloop to play audio */ audio.end_of_stream.connect(() => { loop.quit(); }); diff --git a/src/scannersession.vala b/src/scannersession.vala index e286387..7f19b77 100644 --- a/src/scannersession.vala +++ b/src/scannersession.vala @@ -34,6 +34,11 @@ public class ScannerSession { private set; default = false; } + public string theme { + get; + private set; + default = "beep"; + } public void logout() { logged_in = false; @@ -48,6 +53,7 @@ public class ScannerSession { return false; } this.logged_in = true; + this.theme = audio.get_random_user_theme(); return true; } @@ -62,7 +68,7 @@ public class ScannerSession { /* check if scannerdata has valid format */ if(scannerdata != "USER %d".printf(id)) { - audio.play("system/error.ogg"); + audio.play_system("error.ogg"); write_to_log("Error: Invalid User ID: %s", scannerdata); return false; } @@ -73,11 +79,11 @@ public class ScannerSession { } if(login(id)) { - /* TODO: play audio */ + audio.play_user(theme, "login"); write_to_log("Login: %s (%d)", name, user); return true; } else { - audio.play("system/error.ogg"); + audio.play_system("error.ogg"); write_to_log("Error: Login failed (User ID = %d)", id); return false; } @@ -88,33 +94,33 @@ public class ScannerSession { } if(login(0)) { - /* TODO: play audio */ + audio.play_user(theme, "login"); write_to_log("Login: %s (%d)", name, user); return true; } else { - audio.play("system/error.ogg"); + audio.play_system("error.ogg"); write_to_log("Error: Login failed (User ID = 0)"); return false; } } else if(scannerdata == "UNDO") { if(!logged_in) { - audio.play("system/error.ogg"); + audio.play_system("error.ogg"); write_to_log("Error: Can't undo if not logged in!"); return false; } else { if(db.undo(user)) { - /* TODO: play audio */ + audio.play_user(theme, "purchase"); write_to_log("Undo last purchase!"); return true; } else { - /* TODO: play audio */ + audio.play_user(theme, "error"); write_to_log("Error: Couldn't undo last purchase!"); return false; } } } else if(scannerdata == "LOGOUT") { if(logged_in) { - /* TODO: play audio */ + audio.play_user(theme, "logout"); write_to_log("Logout!"); logout(); return true; @@ -126,19 +132,25 @@ public class ScannerSession { /* check if scannerdata has valid format */ if(scannerdata != "%llu".printf(id)) { - /* TODO: play audio */ + audio.play_user(theme, "error"); write_to_log("Error: invalid product: %s", scannerdata); return false; } + if(!logged_in) { + audio.play_system("error.ogg"); + write_to_log("Error: Login Required!"); + return false; + } + if(db.buy(user, id)) { - /* TODO: play audio */ + audio.play_user(theme, "purchase"); var name = db.get_product_name(id); var price = db.get_product_price(user, id); write_to_log(@"article bought: $name ($price €)"); return true; } else { - /* TODO: play audio */ + audio.play_user(theme, "error"); write_to_log("Error: purchase failed!"); return false; } -- cgit v1.2.3