├── .gitignore
├── README.md
├── docs
├── development
│ ├── contribute.md
│ └── runeaudio-remote-control.md
├── favicon.ico
├── index.md
├── quick-start
│ ├── quick-start-guide.md
│ ├── rpi-hardware-setup.md
│ ├── sd-card-setup-linux.md
│ ├── sd-card-setup-mac.md
│ └── sd-card-setup-windows.md
├── runeui
│ ├── debug.md
│ ├── mpd.md
│ ├── network.md
│ ├── playback.md
│ ├── runeui.md
│ ├── settings.md
│ └── sources.md
└── troubleshooting
│ ├── common-troubleshooting.md
│ ├── extend-partition-sd.md
│ ├── rpi-troubleshooting.md
│ └── updating.md
├── mkdocs.yml
└── runeaudio_theme
├── .jshintrc
├── Gruntfile.js
├── assets
├── css
│ ├── base.css
│ ├── bootstrap-3.0.3.min.css
│ ├── font-awesome-4.0.3.css
│ ├── main.min.css
│ └── prettify-1.0.css
├── fonts
│ ├── fontawesome-webfont.eot
│ ├── fontawesome-webfont.svg
│ ├── fontawesome-webfont.ttf
│ └── fontawesome-webfont.woff
├── img
│ └── favicon.ico
├── js
│ ├── _scripts.js
│ ├── plugins
│ │ └── bootstrap
│ │ │ ├── affix.js
│ │ │ ├── alert.js
│ │ │ ├── button.js
│ │ │ ├── carousel.js
│ │ │ ├── collapse.js
│ │ │ ├── dropdown.js
│ │ │ ├── modal.js
│ │ │ ├── popover.js
│ │ │ ├── scrollspy.js
│ │ │ ├── tab.js
│ │ │ ├── tooltip.js
│ │ │ └── transition.js
│ ├── scripts.min.js
│ └── vendor
│ │ ├── jquery-1.11.0.min.js
│ │ └── prettify-1.0.min.js
└── less
│ ├── app.less
│ ├── bootstrap
│ ├── alerts.less
│ ├── badges.less
│ ├── bootstrap.less
│ ├── breadcrumbs.less
│ ├── button-groups.less
│ ├── buttons.less
│ ├── carousel.less
│ ├── close.less
│ ├── code.less
│ ├── component-animations.less
│ ├── dropdowns.less
│ ├── forms.less
│ ├── glyphicons.less
│ ├── grid.less
│ ├── input-groups.less
│ ├── jumbotron.less
│ ├── labels.less
│ ├── list-group.less
│ ├── media.less
│ ├── mixins.less
│ ├── modals.less
│ ├── navbar.less
│ ├── navs.less
│ ├── normalize.less
│ ├── pager.less
│ ├── pagination.less
│ ├── panels.less
│ ├── popovers.less
│ ├── print.less
│ ├── progress-bars.less
│ ├── responsive-utilities.less
│ ├── scaffolding.less
│ ├── tables.less
│ ├── theme.less
│ ├── thumbnails.less
│ ├── tooltip.less
│ ├── type.less
│ ├── utilities.less
│ ├── variables.less
│ └── wells.less
│ ├── custom-bootstrap.less
│ ├── custom-style.less
│ ├── custom-variables.less
│ └── font-awesome
│ ├── bordered-pulled.less
│ ├── core.less
│ ├── fixed-width.less
│ ├── font-awesome.less
│ ├── icons.less
│ ├── larger.less
│ ├── list.less
│ ├── mixins.less
│ ├── path.less
│ ├── rotated-flipped.less
│ ├── spinning.less
│ ├── stacked.less
│ └── variables.less
├── base.html
├── content.html
├── footer.html
├── nav.html
├── package.json
└── toc.html
/.gitignore:
--------------------------------------------------------------------------------
1 | runeaudio_theme/node_modules
2 | site
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | RuneAudio documentation
2 | ======================
3 | This is the official documentation for [RuneAudio](http://www.runeaudio.com/ "RuneAudio"), written by the [RuneAudio team](http://www.runeaudio.com/team/ "RuneAudio team") and mantained by the [community](http://www.runeaudio.com/forum/ "RuneAudio forum").
4 |
5 | It is written in [Markdown](http://en.wikipedia.org/wiki/Markdown) syntax and built with [MkDocs](http://www.mkdocs.org/).
6 |
7 | Useful resources:
8 |
9 | - [Markdown syntax](http://daringfireball.net/projects/markdown/syntax) - official syntax reference
10 | - [to-markdown](http://domchristie.github.io/to-markdown/) - online HTML to Markdown converter
11 | - [StackEdit](https://stackedit.io/editor) - WYSIWYG Markdown editor
12 |
13 | Contribution
14 | ------------
15 |
16 | > [INFO] **Be part of this!** Anyone can contribute to this documentation.
17 |
18 | By writing and reviewing documentation, you will help:
19 |
20 | - the RuneAudio users, guiding them with installation and troubleshooting
21 | - the RuneAudio team, allowing them to focus on the project development
22 |
23 | If you have anything to fix or details to add, please follow these steps:
24 |
25 | 1. [file an issue on GitHub](https://github.com/RuneAudio/Docs/issues) to allow us to determine whether or not the change should take place *(skip this point in case of typos and spelling mistakes - feel free to fix these and we'll merge in if they are consistent with our style guide)*
26 | 2. file a pull request with your change (one pull request per issue).
27 |
28 | This documentation is intended to be a short and concise set of helpful resources aimed at the majority of users. We will only feature instructions related to the standard use of the software, in order to keep it clean, manageable and up to date.
29 |
30 | Resources
31 | ---------
32 |
33 | This documentation is written in [Markdown](http://en.wikipedia.org/wiki/Markdown) syntax and built with [MkDocs](http://www.mkdocs.org/).
34 |
35 | Some useful resources which make easier to contribute to write and mantain it:
36 |
37 | - [Markdown syntax](http://daringfireball.net/projects/markdown/syntax) - official syntax reference
38 | - [Markdown help](http://stackoverflow.com/editing-help) - syntax hints from Stack Overflow
39 | - [to-markdown](http://domchristie.github.io/to-markdown/) - online HTML to Markdown converter
40 | - [StackEdit](https://stackedit.io/editor) - WYSIWYG Markdown editor
--------------------------------------------------------------------------------
/docs/development/contribute.md:
--------------------------------------------------------------------------------
1 | #Contribute to RuneAudio
2 |
3 | RuneAudio is an open source project and anyone could [contribute to it](http://www.runeaudio.com/forum/help-the-project-f24.html "Help the project").
4 |
5 | An interesting reading for anyone who wants to contribute to the project in some way:
6 | [[14 Ways to Contribute to Open Source without Being a Programming Genius or a Rock Star]](http://blog.smartbear.com/programming/14-ways-to-contribute-to-open-source-without-being-a-programming-genius-or-a-rock-star/ "14 Ways to Contribute to Open Source without Being a Programming Genius or a Rock Star")
7 |
8 | ##Coding
9 | [RuneUI](http://www.runeaudio.com/about/#runeui "RuneUI") is the default UI of RuneAudio. Due to its nature (web interface) it is platform agnostic and responsive, and can be used from any device capable of running a modern web browser.
10 |
11 | RuneUI is developed in **PHP** (backend) and **HTML**, **CSS** and **Javascript** (frontend).
12 |
13 | [[RuneUI on GitHub]](https://github.com/RuneAudio/RuneUI "RuneUI on GitHub")
14 |
15 | ##OS Maintenance
16 | [RuneOS](http://www.runeaudio.com/about/#runeos "RuneOS") is a customized and optimized build of the [Arch Linux](https://www.archlinux.org/) distro, specifically tailored around the scope of best sound quality achievement. The system continuously needs to be updated and ported to all the [certified platforms](http://www.runeaudio.com/certified-devices/ "Certified platforms").
17 |
18 | [[RuneOS on GitHub]](https://github.com/RuneAudio/RuneOS "RuneOS on GitHub")
19 |
20 | ##Localization
21 | RuneUI will be soon translated in multiple languages. The translation work is managed via [Transifex](https://www.transifex.com/ "Transifex"):
22 | [[RuneUI on Transifex]](https://www.transifex.com/projects/p/runeui/ "RuneUI on Transifex")
23 |
24 | You can follow the progress of the localization progress and discuss about it [in the dedicated topic](http://www.runeaudio.com/forum/localization-t333.html "Localization") in the forum.
25 |
26 | ##Donations
27 | RuneAudio is brought to you for FREE as result of the hard and passionate work of [the people behind it](http://www.runeaudio.com/team/).
28 | If you find our work useful, interesting and professional and you like and enjoy it, please help us to keep putting time and quality into this project.
29 |
30 | [\[Make a donation\]](http://www.runeaudio.com/support-us/ "Support us")
--------------------------------------------------------------------------------
/docs/development/runeaudio-remote-control.md:
--------------------------------------------------------------------------------
1 | #RuneAudio Remote Control
2 |
3 | 
4 |
5 | [](https://play.google.com/store/apps/details?id=com.runeaudio)
6 |
7 | **RuneAudio Remote Control** makes it even easier to control one or more RuneAudio music players from your Android™ device.
8 |
9 | ## Main features
10 |
11 | - **Player discovery** - scan the local network for connected RuneAudio compatible players
12 | - **Fullscreen UI** - RuneUI is displayed in true fullscreen, with no additional browser bars
13 | - **Volume control** - adjust the volume with the physical buttons on your phone
14 |
15 | ## FAQ
16 |
17 | ### How does it work?
18 | [RuneUI](../runeui/runeui.md) is a web interface and is normally accessed by pointing a web browser to [http://runeaudio](http://runeaudio) or [http://runeaudio.local](http://runeaudio.local) or the IP address of the player.
19 | RuneAudio Remote Control skips this step: it scans the local network and automatically shows all the connected RuneAudio players, allowing you to control them from the same place.
20 | It also displays the RuneUI in a true full screen, with no browsers bars and weird scroll behaviours.
21 |
22 | The app uses the [avahi protocol](https://en.wikipedia.org/wiki/Avahi_%28software%29) to scan the local network.
23 | It detects the connected RuneAudio players which expose the avahi service and lists them, showing also their IP and MAC addresses.
24 |
25 | ###The app does not find my player
26 | The player could not expose the required service properly. Check the [compatibility chapter](#compatibility) below.
27 |
28 | ###RuneUI only shows a spinning wheel
29 | If the app finds your player and connects to it but RuneUI only shows a spinning wheel, your Android device could not be compatible. Check the [compatibility chapter](#compatibility) below.
30 |
31 | ## Compatibility
32 |
33 | ### Android version
34 |
35 | RuneAudio Remote Control uses the **default stock browser** to embed the webview in full screen.
36 | Unfortunatly, **websockets** are not fully supported in the default browser on most Android devices before 4.4 KitKat version.
37 | Since RuneUI uses websockets to communicate with the browser in real time, it won't work properly on older device, showing a spinning wheel (unable to connect).
38 |
39 | ### RuneAudio version
40 |
41 | Check if your player is up to date with the [latest nightly build of RuneAudio](../troubleshooting/updating.md#nightly-builds).
42 | If the file `/etc/avahi/services/runeaudio.service` doesn't exist or is empty, create it with the following content:
43 | ```
44 |
45 |
46 |
47 | RuneAudio [device_name] [xx:xx:xx:xx:xx:xx]
48 |
49 | _http._tcp
50 | 80
51 |
52 |
53 | ```
54 | Replace the following values with the desired ones:
55 |
56 | - `device_name` is the name of the device you want to be shown in the UI (i.e.: Raspberry Pi 2);
57 | - `xx:xx:xx:xx:xx:xx` is the MAC address of the network adapter (LAN or WiFi) the player is using to connect to the local network (check it with the `ifconfig` command).
58 |
59 |
60 | ## Support
61 |
62 | To get support or to discuss about the app development, join us the dedicated thread on the forum.
63 | [[RuneAudio Remote Control - RuneAudio Forum]](http://www.runeaudio.com/forum/runeaudio-remote-control-for-android-t3154.html)
64 |
65 | ## Credits
66 |
67 | - **[Elliot Nathanson](https://www.linkedin.com/in/elliot-nathanson-7815151)** - main developer
68 | - **[Andrea Coiutti](http://www.runeaudio.com/team/)** - design
--------------------------------------------------------------------------------
/docs/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RuneAudio/Docs/a5546e1f1f276ff583a80511b9b5eae9894d9ec2/docs/favicon.ico
--------------------------------------------------------------------------------
/docs/index.md:
--------------------------------------------------------------------------------
1 | # RuneAudio documentation
2 |
3 | This is the official documentation for [RuneAudio](http://www.runeaudio.com/ "RuneAudio"), written by the [RuneAudio team](http://www.runeaudio.com/team/ "RuneAudio team") and mantained by the [community](http://www.runeaudio.com/forum/ "RuneAudio forum").
4 |
5 | ## Table of contents
6 |
7 | 1. **Quick start**
8 | - [Quick start guide](quick-start/quick-start-guide.md)
9 | - [Flashing the SD Card using Windows](quick-start/sd-card-setup-windows.md)
10 | - [Flashing the SD Card using Mac](quick-start/sd-card-setup-mac.md)
11 | - [Flashing the SD Card using Linux](quick-start/sd-card-setup-linux.md)
12 | - [Raspberry Pi hardware setup](quick-start/rpi-hardware-setup.md)
13 | 2. **RuneUI**
14 | - [Introduction to RuneUI](runeui/runeui.md)
15 | - [Playback](runeui/playback.md)
16 | - [Sources](runeui/sources.md)
17 | - [MPD](runeui/mpd.md)
18 | - [Settings](runeui/settings.md)
19 | - [Network](runeui/network.md)
20 | - [Debug](runeui/debug.md)
21 | 3. **Troubleshooting**
22 | - [Common troubleshooting](troubleshooting/common-troubleshooting.md)
23 | - [Raspberry Pi troubleshooting](troubleshooting/rpi-troubleshooting.md)
24 | - [Extend a partition](troubleshooting/extend-partition-sd.md)
25 | - [Getting updates](troubleshooting/updating.md)
26 | 4. **Development**
27 | - [Contribute](development/contribute.md)
28 | - [RuneAudio Remote Control](development/runeaudio-remote-control.md)
29 |
30 | ## Contribution
31 |
32 | > [INFO] **Be part of this!** Anyone can contribute to this documentation.
33 |
34 | By writing and reviewing documentation, you will help:
35 |
36 | - the RuneAudio users, guiding them with installation and troubleshooting
37 | - the RuneAudio team, allowing them to focus on the project development
38 |
39 | If you have anything to fix or details to add, please follow these steps:
40 |
41 | 1. [file an issue on GitHub](https://github.com/RuneAudio/Docs/issues) to allow us to determine whether or not the change should take place *(skip this point in case of typos and spelling mistakes - feel free to fix these and we'll merge in if they are consistent with our style guide)*
42 | 2. file a pull request with your change (one pull request per issue).
43 |
44 | This documentation is intended to be a short and concise set of helpful resources aimed at the majority of users. We will only feature instructions related to the standard use of the software, in order to keep it clean, manageable and up to date.
45 |
46 | ## Resources
47 |
48 | This documentation is written in [Markdown](http://en.wikipedia.org/wiki/Markdown) syntax and built with [MkDocs](http://www.mkdocs.org/).
49 |
50 | Some useful resources which make easier to contribute to write and mantain it:
51 |
52 | - [Markdown syntax](http://daringfireball.net/projects/markdown/syntax) - official syntax reference
53 | - [Markdown help](http://stackoverflow.com/editing-help) - syntax hints from Stack Overflow
54 | - [to-markdown](http://domchristie.github.io/to-markdown/) - online HTML to Markdown converter
55 | - [StackEdit](https://stackedit.io/editor) - WYSIWYG Markdown editor
56 |
--------------------------------------------------------------------------------
/docs/quick-start/quick-start-guide.md:
--------------------------------------------------------------------------------
1 | # Quick start guide
2 |
3 | > [INFO] This guide assumes that you already own [a certified device](http://www.runeaudio.com/certified-devices/ "Certified devices") on which to run RuneAudio, and an SD card (at least 4GB) on which to write the image file.
4 |
5 | ## Download and extract
6 |
7 | Download the latest RuneAudio image released for your device.
8 |
9 | [[ Go to the download page ]](http://www.runeaudio.com/download/ "Download")
10 |
11 | Once the download is completed, extract the contents of the .zip file with a compressed file manipulation utility (e.g.: [7-Zip](http://www.7-zip.org/download.html) on Windows, [Zipeg](http://www.zipeg.com/) on Mac, [Unzip](http://linux.about.com/od/commands/l/blcmdl1_unzip.htm) on Linux). You will now have an **.img** (raw disk image) file.
12 |
13 | ## Prepare the SD card
14 |
15 | Write the extracted .img file to your SD card, following the instruction in one of the following guides:
16 |
17 | * [Flashing the SD Card using Windows](../quick-start/sd-card-setup-windows.md)
18 | * [Flashing the SD Card using Mac](../quick-start/sd-card-setup-mac.md)
19 | * [Flashing the SD Card using Linux](../quick-start/sd-card-setup-linux.md)
20 |
21 | When the write process has finished, safely unmount the SD card and plug it into your device.
22 |
23 | > [WARNING] Make sure your SD card is not [write protected](http://kb.sandisk.com/app/answers/detail/a_id/1102/~/memory-card-is-write-protected-or-locked) before writing the image to it, and before plugging it into your device.
24 |
25 | ## Prepare the device
26 |
27 | 1. If you have a USB DAC plug it into a USB port, otherwise just plug in the analog jack;
28 | 2. If you have a USB storage device, plug it into a USB port. If you intend to use a USB hard drive the use of an external power supply (if available), or at least a USB powered hub, is highly recommended;
29 | 3. Plug in your ethernet connector;
30 | 4. Plug the PSU to the device;
31 | 5. Power the device on.
32 |
33 | RuneAudio will now boot on your device for the first time, acquiring an IP address (with enabled DHCP on your LAN).
34 |
35 | ## Player setup
36 |
37 | ### The web interface – RuneUI
38 |
39 | RuneAudio comes with its web interface, **[RuneUI](http://www.runeaudio.com/about/#runeui "RuneUI")**, which permits you to browse your music library, control the playback and to configure the player. It works on any device and virtually any platform. It is designed to be easy to use and intuitive.
40 |
41 | More detailed information in the dedicated section:
42 |
43 | [[ RuneUI ]](../runeui/runeui.md)
44 |
45 | ### Accessing the RuneUI
46 |
47 | You can connect to the RuneUI in several ways:
48 |
49 | * (Windows) open the following address in your browser: [http://runeaudio](http://runeaudio) or [http://runeaudio.](http://runeaudio.) (works if an [Avahi](http://en.wikipedia.org/wiki/Avahi_%28software%29 "Avahi")/[Bonjour](http://en.wikipedia.org/wiki/Bonjour_%28software%29 "Bonjour") client is installed)
50 | (OSX / Linux / Android) open the following address in your browser: [http://runeaudio.local](http://runeaudio.local)
51 | * If you cannot connect using the abovementioned addresses, look up the IP address of your device (check your routers DHCP list) and point your browser to it (e.g. [http://192.168.1.xxx](http://192.168.1.xxx/))
52 | * (Windows) you should find a new icon under _My Network Places_, called _RuneAudio_: double click it to open you the RuneUI in your default browser, or place a shortcut to the RuneUI on your desktop, which can then be double clicked to open the RuneUI.
53 |
54 | ### Database configuration
55 |
56 | #### MENU > Sources
57 |
58 | RuneAudio scans your digital music library and stores all information in an internal database.
59 | Before it can do this, you need to tell it where your digital music is located.
60 |
61 | Local USB storage drives are automatically detected. If you connect an USB drive and nothing happens, manually update the DB by clicking on **UPDATE MPD DATABASE** button.
62 |
63 | Network attached storage (NAS) drives can be added via Samba/NFS. To add a network source, click on the **ADD NEW MOUNT** button and fill in the form in the next screen. After saving the mount, it will be displayed in the configured network mounts list. A green check will appear on it if the source is successfully mounted.
64 |
65 | More detailed information in the dedicated section:
66 |
67 | [[ Sources ]](../runeui/sources.md)
68 |
69 | ## Advanced users
70 |
71 | > [WARNING] Make sure you are completely confident and that you know what you are doing before fiddling about, as you could mess things up. Alteration of the configuration might result in you having to reimage your SD card and start again.
72 |
73 | Due to the integrated nature of the system (and the strong interaction between RuneUI and RuneOS), the manual editing of the system configuration files is not recommended, as they are periodically written by the RuneUI PHP worker. Please understand this behaviour before complaining about any malfunctions which may occur as a result of any manual modification.
74 |
75 | If you have confidence in your skills, these are the root credentials for advanced users who want command line access:
76 |
77 | user: root
78 | password: rune
79 |
80 | ## More help
81 |
82 | Didn’t find the information you were looking for here?
83 | Feel free to browse through the forum for answers, and to post in the forum to ask for help if you cannot find a solution:
84 |
85 | [[ Go to the forum ]](http://www.runeaudio.com/forum/ "RuneAudio Forum")
86 |
--------------------------------------------------------------------------------
/docs/quick-start/sd-card-setup-linux.md:
--------------------------------------------------------------------------------
1 | # Flashing the SD Card using Linux
2 |
3 | > [INFO] This part of the guide assumes that you already followed the first part of the [Quick start guide](quick-start-guide.md).
4 |
5 | ## Intro
6 |
7 | The SD card will be the home for your unit's Operating System. This installation will flash the RuneOS onto the card, along with formatting the card to a bootable state. This is different than copying the image onto the drive, but similar and almost as easy.
8 |
9 | > [INFO] We recommend removing all other USB devices at this time to avoid confusion during flashing.
10 |
11 | ## Procedure using ImageWriter (graphical interface)
12 |
13 | - Install the ImageWriter tool (via *Ubuntu Software Center*, via command line with `apt-get ...`, etc.)
14 | - Insert your card into the card reader, and the card reader into your USB port.
15 | - Launch the ImageWriter tool (it needs your administrative password) and select the image file.
16 | - Select the target device to write the image to (your device will be something like `/dev/mmcblk0` or `/dev/sdc`). If you're not sure what to choose, then check it through `df -h` command (see below) or GParted.
17 |
18 | > [WARNING] **Double-check your card's name!** Choosing the wrong drive will likely result in data loss or even worse harm to your computer.
19 |
20 | - Click the *Write to device* button. The write may take a while, so don't panic.
21 | - When write has completed, close the program, and **properly eject your drive.**
22 | - You are now ready to plug your SD card into your device. Easy, right?
23 |
24 | ## Procedure using the command line
25 |
26 | - Run `df -h` command to see what devices are currently mounted.
27 | - Insert your card into the card reader, and the card reader into your USB port.
28 | - Make sure that the device is mounted; the easiest way to do that is to open it with your file manager.
29 | - Run `df -h` again. The device that wasn't there last time is your SD card. The left column gives the device name of your SD card. It will be listed as something like `/dev/mmcblk0p1` or `/dev/sdd1`. The last part (`p1` or `1` respectively) is the partition number, but you want to write to the whole SD card, not just one partition, so you need to remove that part from the name (getting for example `/dev/mmcblk0` or `/dev/sdd`) as the device for the whole SD card.
30 | - Unmount the card with `umount /dev/[sd_name]` command, where `[sd_name]` is the name you got from the previous step.
31 |
32 | > [INFO] You can also check device name through [GParted](http://gparted.org/).
33 |
34 | - Write the image to the card with command `sudo dcfldd bs=1M if=[img_file_path] of=/dev/[sd_name]`, replacing `if=` argument with the path to your **.img** file, and the `of=` argument with the right device name. The write may take a while, so don't panic.
35 |
36 | > [WARNING] **Double-check your card's name!** Choosing the wrong drive will likely result in data loss or even worse harm to your computer.
37 |
38 | - When write has completed, run command `sudo sync` (this will ensure the write cache is flushed and that it is safe to unmount your SD card) and **properly eject your drive.**
39 | - You are now ready to plug your SD card into your device. Easy, right?
40 |
41 | ***
42 |
43 | Ready to get listening? Let's [plug stuff in!](http://www.runeaudio.com/documentation/quick-start/quick-start-guide/#prepare-the-device)
44 |
45 | Having Issues? Head on over to [Troubleshooting](http://www.runeaudio.com/documentation/troubleshooting/common-troubleshooting/) for some help.
46 |
--------------------------------------------------------------------------------
/docs/quick-start/sd-card-setup-mac.md:
--------------------------------------------------------------------------------
1 | # Flashing the SD Card using Mac
2 |
3 | > [INFO] This part of the guide assumes that you have already [downloaded and extracted](../quick-start/quick-start-guide.md#download-and-extract) the image file
4 |
5 | First of all, make sure your SD card is inserted in one of the slots of your Mac (in an USB card reader or directly in the integrated SD card reader slot, if your device has one).
6 |
7 | Next step is to launch a *terminal* window on your Mac and enter the following command:
8 |
9 | `diskutil list`
10 |
11 | which will list all the disks that are attached to your MAC.
12 | The resulting output will look something like this:
13 |
14 | /dev/disk0
15 | #: TYPE NAME SIZE IDENTIFIER
16 | 0: GUID_partition_scheme *500.3 GB disk0
17 | 1: EFI EFI 209.7 MB disk0s1
18 | 2: Apple_CoreStorage 499.4 GB disk0s2
19 | 3: Apple_Boot Boot OS X 134.2 MB disk0s3
20 | /dev/disk1
21 | #: TYPE NAME SIZE IDENTIFIER
22 | 0: Apple_HFS Macintosh HD *499.1 GB disk1
23 | /dev/disk2
24 | #: TYPE NAME SIZE IDENTIFIER
25 | 0: FDisk_partition_scheme *7.9 GB disk2
26 | 1: DOS_FAT_32 CANAKIT 7.9 GB disk2s1
27 |
28 | Find the unit name that corresponds to your SD card (looking at the sizes of the drives will help you identify the right one).
29 | In the previous example, it's `/dev/disk2`.
30 |
31 | Before proceeding with the flash of the SD card, you should unmount it first. To do that, launch the **Disk Utility** tool and unmount the SD Card.
32 | Do NOT eject it, simply unmount it with a right-click.
33 | Alternatively, you can also unmount the disk manually, by typing the following in the terminal window:
34 |
35 | `diskutil unmountDisk /dev/disk2`
36 |
37 | > [WARNING] **Double-check your card's drive letter!** Choosing the wrong drive will likely result in data loss or even worse harm to your computer.
38 |
39 | To write the image to the SD card, the command syntax is:
40 |
41 | `dd bs=1m if=[source] of=[destination]`
42 |
43 | so a real example of the command is:
44 |
45 | `dd bs=1m if=/Users/antonypa/Desktop/RuneAudio_rpi_0.3-beta_20141029_2GB.img of=/dev/disk2`
46 |
47 | if you get the following message (very likely):
48 |
49 | `dd: /dev/disk2: Permission denied`
50 |
51 | just add *sudo* in front of the command, which will prompt for your password.
52 |
53 | `sudo dd bs=1m if=/Users/antonypa/Desktop/RuneAudio_rpi_0.3-beta_20141029_2GB.img of=/dev/disk2`
54 |
55 | After launching the command you should wait for the flashing process to complete. It can take several minutes, and you'll know that it has completed when the prompt comes back with no errors.
56 |
57 | ***
58 |
59 | Ready to get listening? Let's [plug stuff in!](http://www.runeaudio.com/documentation/quick-start/quick-start-guide/#prepare-the-device)
60 |
61 | Having Issues? Head on over to [Troubleshooting](http://www.runeaudio.com/documentation/troubleshooting/common-troubleshooting/) for some help.
62 |
63 | *This guide has been greatly (if not almost entirely) inspired by the "Installing OpenELEC Help" guide.*
64 |
--------------------------------------------------------------------------------
/docs/quick-start/sd-card-setup-windows.md:
--------------------------------------------------------------------------------
1 | # Flashing the SD Card using Windows
2 |
3 | > [INFO] This part of the guide assumes that you already followed the first part of the [Quick start guide](quick-start-guide.md).
4 |
5 | ## Intro
6 |
7 | The SD card will be the home for your unit's Operating System. This installation will flash the RuneOS onto the card, along with formatting the card to a bootable state. This is different than copying the image onto the drive, but similar and almost as easy.
8 |
9 | > [INFO] We recommend removing all other USB devices at this time to avoid confusion during flashing.
10 |
11 | ## Procedure using USB Image Tool
12 |
13 | - Download and install the latest version of [USB Image Tool](http://www.alexpage.de/usb-image-tool/download/).
14 | - Insert your card into the card reader, the card reader into your USB port, and check which drive letter it has been assigned.
15 | - Run USB Image Tool (your computer may ask you to agree to run the program - click *Yes*).
16 | - From the top left pull-down menu, choose *Device* mode.
17 |
18 | 
19 |
20 | - In the left panel choose your SD card.
21 |
22 | > [WARNING] **Double-check your card's drive letter!** Choosing the wrong drive will likely result in data loss or even worse harm to your computer.
23 |
24 | - Choose the *Favorites* tab.
25 | - Click the *Add* button and browse to the RuneAudio image file. You may also choose to use the still-compressed file. Simply click the drop down menu near the bottom of the browse screen, choose *Compressed (gzip) image files* or *All Files* and choose which image you wish to flash.
26 | - In the *Favorites* screen, click to highlight the image you wish to flash and then click *Restore*. The write may take a while, so don't panic.
27 | - When write has completed, close the program, and **properly eject your drive.**
28 | - You are now ready to plug your SD card into your device. Easy, right?
29 |
30 | ## Procedure using Win32DiskWriter
31 |
32 | - Download and install the latest version of [Win32DiskImager](http://sourceforge.net/projects/win32diskimager/).
33 | - Insert your card into the card reader, the card reader into your USB port, and check which drive letter it has been assigned.
34 | - Run Win32DiskWriter (your computer may ask you to agree to run the program - click *Yes*).
35 | - Click the folder icon and browse to your RuneOS image file.
36 |
37 | 
38 |
39 | - Under *Device* choose your SD card from the drop-down menu.
40 |
41 | > [WARNING] **Double-check your card's drive letter!** Choosing the wrong drive will likely result in data loss or even worse harm to your computer.
42 |
43 | - Click *Write*. The write may take a while, so don't panic.
44 | - When write has completed, close the program, and **properly eject your drive.**
45 | - You are now ready to plug your SD card into your device. Easy, right
46 |
47 | ***
48 |
49 | Ready to get listening? Let's [plug stuff in!](http://www.runeaudio.com/documentation/quick-start/quick-start-guide/#prepare-the-device)
50 |
51 | Having Issues? Head on over to [Troubleshooting](http://www.runeaudio.com/documentation/troubleshooting/common-troubleshooting/) for some help.
52 |
53 | ## Notes
54 |
55 | Larger cards, once written, will only show ~2GB worth of space, taken up by the file system. This is simply because RuneAudio uses a file format which is not visible in Windows.
56 |
--------------------------------------------------------------------------------
/docs/runeui/debug.md:
--------------------------------------------------------------------------------
1 | # Debug
2 |
3 | > [MENU] Menu > Debug
4 |
5 | The Debug Data screen provides information about the current state of your system that may help diagnose problems.
6 |
7 | A button at the top of the screen ("Copy data to clipboard") copies this information to your clipboard so you can easily paste it in the forum when requesting help.
8 |
9 | ## System info
10 |
11 | ## System load statistics
12 |
13 | ## Active processes
14 |
15 | ## Audio backend
16 |
17 | ## MPD Configuration
18 |
19 | ## Kernel module snd_usb_audio settings
20 |
21 | ## Systemd active startup scripts
22 |
23 | ## Filesystem mounts
24 |
25 | ## Loaded kernel modules
26 |
27 | ## Network listening sockets
28 |
29 | ## Network established sockets
30 |
31 | ## Network interfaces
32 |
33 | ## Network netctl profiles
34 |
35 | ## Network wifi status
36 |
37 | ## Kernel status
38 |
39 | ## PHP backend
40 |
--------------------------------------------------------------------------------
/docs/runeui/mpd.md:
--------------------------------------------------------------------------------
1 | # MPD
2 |
3 | > [MENU] Menu > MPD
4 |
5 | The MPD screen is the main configuration page for the Music Player Daemon (MPD), the system responsible for audio playback. In case of any problems you can use the link provided at the top of this screen ("reset to default") to reset everything to the default settings.
6 |
7 | ## Audio output
8 |
9 | The first option is for selecting the Audio Output Interface. The choices here will change depending upon the various "sound cards" you have available to your system. Typically, this list will contain all of the output devices native to your hardware, as well as any USB DACs you have connected. In some cases, namely when you configure an I2S DAC Driver on the Settings screen, an I2S Output will be available for selection.
10 |
11 | ## Volume control
12 |
13 | There are 3 options available for volume control.
14 |
15 | - The "disabled" option disables the volume control on the Playback tab, meaning you will need to use a pre-amp or other external volume control. This often provides the best sonic performance.
16 | - The "enabled – software" option enables an internal software mixer that allows you to adjust the playback volume on the Playback tab. Doing so alters the bits being sent to your DAC (or the internal DAC chip if you have selected an internal sound card for playback). Altering the bits means the music you are listening to is no longer "bit perfect." Software algorithms for volume control use dithering, a way of "guessing" at the data which can be quite accurate. What this means is that software volume control can sound quite good, especially compared to a poorly implemented analogue volume control.
17 | - The "enabled – hardware" allows for changing the volume through the actual soundcard's driver, if this feature is implemented by your chosen Audio Output Interface.
18 |
19 | ## General music daemon options
20 |
21 | #### Port
22 |
23 | The default port for MPD is 6600. If you want to use a third-party device or software to control playback, you will need to connect to MPD on your Rune device using this port.
24 |
25 | #### Daemon user : group
26 |
27 | You can choose which user account on your device you would like to run MPD as using the Daemon user : group selection.
28 |
29 | #### Log level
30 |
31 | Log level allows you to control how much data is logged while running MPD. This can be useful for debugging and tracking down playback issues. This setting controls the type of information which is logged. Available setting arguments are "disabled", "default", "secure" or "verbose". The "verbose" setting argument is recommended for troubleshooting, though it can quickly fill the available resources on limited hardware storage.
32 |
33 | #### State file
34 |
35 | State file specifies if a state file is used. If the state file is active, the state of MPD will be saved when MPD is terminated by a TERM signal or by the "kill" command. When MPD is restarted, it will read the state file and restore the state of MPD (including the playlist).
36 |
37 | #### FFmpeg decoder plugin
38 |
39 | The FFmpeg decoder setting should be set to enabled if you require AAC / ALAC support. Doing so may slow down the performance of the MPD database refresh.
40 |
41 | #### FFmpeg decoder plugin
42 |
43 | Gapless MP3 playback allows you to enable gapless mode while playing MP3s. However, if you have problems with your MP3s ending abruptly, it is recommended that you set this argument to "disabled" to attempt to fix the problem. [NOTE: If this solves the problem, it is highly recommended to fix the MP3 files with vbrfix (available as vbrfix in the debian archive), at which point gapless MP3 playback can be enabled.]
44 |
45 | #### FFmpeg decoder plugin
46 |
47 | DSD Support enables and disables support for playing DSD Audio.
48 |
49 | #### Volume normalization
50 |
51 | Volume normalization is a feature that instructs MPD to attempt to play back all audio files at a consistent volume level. This is great for parties or other situations where your music serves as background. When this setting is turned off, some tracks may play substantially louder than others. NOTE: Enabling this feature means your audio will no longer be bit perfect.
52 |
53 | #### Audio buffer size
54 |
55 | Audio buffer size manages the size of the playback buffer. The default is 2048, large enough for nearly 12 seconds of CD-quality audio. Lower values can produce sonic benefits, but can also introduce skips and pops.
56 |
57 | #### Buffer before play
58 |
59 | Buffer before play specifies how much of the audio buffer should be filled before playing a song. Try increasing this setting if you hear skipping when manually changing songs. The default is 10%, a little over 1 second of CD-quality audio with the default buffer size.
60 |
61 | #### Auto update
62 |
63 | Auto update determines whether MPD will automatically update the music database when files in the music directory are changed.
64 |
65 | After making any changes on this screen, press "Save and apply" to save the changes.
66 |
67 |
--------------------------------------------------------------------------------
/docs/runeui/network.md:
--------------------------------------------------------------------------------
1 | # RuneUI
2 |
3 | > [MENU] Menu > Network
4 |
5 | The Network configuration screen provides a means of configuring your network connections, both Ethernet and Wireless (WiFi).
6 |
7 | The button at the top of this screen ("Refresh Interfaces") refreshes the screen to show all available network interfaces.
8 |
9 | ## Network Interfaces
10 |
11 | This section lists the interfaces found on your system. Clicking an interface in this list opens the editor for that interface's settings.
12 |
13 | #### Interface Properties
14 |
15 | This panel displays additional information about the selected interface.
16 |
17 | #### Interface configuration
18 |
19 | The IP Assignment selector allows you to chose between "DHCP" and "Static."
20 |
21 | - The *DHCP* selection (typical) instructs the device to get its IP address from a DHCP server on your network, most likely your router. With this setting selected, the IP address of your device can change over time.
22 |
23 | - The *Static* selection allows you to manually configure an IP address for your device. This means your Rune device will maintain the same IP address after each reboot, and can be connected to using that same IP address each time. When selecting *Static*, you need to enter the required information yourself.
--------------------------------------------------------------------------------
/docs/runeui/playback.md:
--------------------------------------------------------------------------------
1 | # Playback
2 |
3 | > [MENU] Menu > Playback
4 |
5 | The Playback section has 3 tabs, located at the bottom of your screen. The tabs are: Library, Playback and Queue.
6 |
7 | ##Library Tab
8 |
9 | The Library tab provides access to your music library. You can quickly access your music from various places. By default, there are 6 buttons here. "Network mounts” provides access to storage media connected to your network, typically referred to as Network Attached Storage (NAS). "USB Storage” contain lists of content stored on a USB drive connected directly to your system. "My Webradios” allows you to maintain a list of web based radio stations by adding the name and URL for the feed to Rune. "Spotify” provides access to your Spotify online account. "Dirble” provides easy access to thousands of online radio stations. "Jamendo” provides access to Jamendo, a music website and an open community of music authors. It bills itself as "the world's largest digital service for free music". You can also add music folders to this list (See "Add bookmark" below).
10 |
11 | Upon pressing the button, you have a "back" button and search bar at the top of the screen. Below that is a list of your NAS mounts (added in Sources menu item). At the bottom of the screen are up and down arrows, letting you navigate through your library, to the top, the bottom, or one page at a time.
12 |
13 | Pressing an item in the list performs a command, depending on the type of item. For folders, it opens the folder. For tracks, it highlights the track. Double clicking a track adds it to the bottom of the queue, and immediately plays it. Clicking the 3 horizontal line icon (Actions) presents options depending on the type of item. For folders, the options are: Add, Add and play, Add replace and play, Update this folder and Save as bookmark. For files, the options are: Add, Add and play, Add replace and play.
14 |
15 | Add appends the file, or the contents of the folder, to the end of the queue. Add and play does the same thing as Add while also playing the file (or first file if adding a folder). Add, replace and play clears the current queue, adds the file (or folder contents) to the queue, and plays the file (or first file in the folder). Updating this folder retrieves the content of the folder from the disk, and updates the MPD database. "Save as bookmark" creates a button on the main Library screen with a shortcut to that folder.
16 |
17 |
18 | ##Playback Tab
19 |
20 | The Playback page allows you to manage the currently playing track. At the top of the page is the Artist. Beneath that is the Track Title. Beneath that is the Album name, or "[no album]" if the Album is not tagged in the metadata.
21 |
22 | Beneath the Track information is the Playback Source. Options are MPD, Spotify, Airplay and DLNA. Clicking the label will open a selector, allowing you to choose the playback source.
23 |
24 | Beneath the Playback Source you will find 3 graphical components. The first is the Track Position meter. The meter visually represents the played and the remaining duration. Inside the meter are the Current Position and the Total Duration of the track. There are 3 buttons beneath the Track Position. The first toggles the "Repeat" function. The second toggles the "Random Play" function. The last toggles the "Single Track" function.
25 |
26 | In the center, if enabled, is an image of the album/cover art. Below it is the "Share" button, which allows you to post details of the current track on Twitter, Facebook and Google+. The last button takes you to a page where you can learn how to support our efforts.
27 |
28 | On the right are the Volume Controls. The main graphical control represents the position of the Volume knob, and the numerical value, from 0 to 100. There are 3 buttons beneath the Volume Control. The first turns the volume down by 1%. The center button toggles the Mute function. The last button turns the volume up by 1%.
29 |
30 | ##Queue Tab
31 |
32 | The Queue tab displays the tracks that are in the current playlist, or queue. A search box at the top of the screen filters the contents of the queue list for those tracks that match the search terms you type. Pressing an item in the Queue listing plays that item. Pressing the "x” icon on the far right removes the item from the Queue. At the bottom left of the screen are 3 additional items. The "document” icon takes you to the playlists management screen. The "floppy disk” icon allows you to save the current Queue as a named playlist. Simply enter a name and click "Save playlist” to create a new playlist from the existing queue. The "trash can” icon prompts you to clear the contents of the current queue.
33 |
34 |
35 |
--------------------------------------------------------------------------------
/docs/runeui/runeui.md:
--------------------------------------------------------------------------------
1 | # RuneUI
2 |
3 | ## Introduction to the RuneUI
4 |
5 | RuneAudio features **RuneUI**, a unique integrated and easy to use interface.
6 |
7 | ##### A web interface
8 |
9 | Built in PHP, JavaScript and CSS. Due to its nature it’s **platform independent**, being accessible from every modern web browser, on every operating system.
10 |
11 | ##### A MPD client
12 |
13 | Allowing the user to control the playback, browse the music database, manage playlists and edit the play queue.
14 |
15 | ##### A control panel
16 |
17 | System configurations can be tweaked to obtain the best audio performance. It grants access to a number of system commands, without the need to open a terminal session.
18 |
19 | It is **designed to be responsive**, and it displays correctly, scaling itself for every kind of device, including: desktop PCs, laptops, netbooks, tablets and smartphones.
20 |
21 | ## Main sections
22 |
23 | The following are the main sections of the RuneUI, reachable through the navigation menu at the top right corner of the screen:
24 |
25 | 1. [Playback](playback.md)
26 | 2. [Sources](sources.md)
27 | 3. [MPD](mpd.md)
28 | 4. [Settings](settings.md)
29 | 5. [Network](network.md)
30 | 6. [Debug](debug.md)
31 |
32 | ## Historical background
33 |
34 | For some historical background about the RuneUI and its authors, you can read this post in the forum:
35 |
36 | [[ About RuneAudio and Volumio ]](http://www.runeaudio.com/forum/about-runeaudio-and-volumio-t90.html)
--------------------------------------------------------------------------------
/docs/runeui/settings.md:
--------------------------------------------------------------------------------
1 | # Settings
2 |
3 | > [MENU] Menu > Settings
4 |
5 | The Settings screen provides a means of managing the settings for your Rune device.
6 |
7 | ## Environment
8 |
9 | #### Check system status
10 |
11 | The "show status" button allows you to see information regarding the system and its status, such as the actively running kernel, system time, uptime, hardware platform and the player ID.
12 |
13 | #### Player hostname
14 |
15 | This allows you to set the name of your device, which is how you will reach the RuneUI running on it. For example, naming your device "MyDevice" (without the quotes) would allow you to control it at the following URL: http://MyDevice
16 |
17 | #### NTP server
18 | This allows you to set a reference time sync server (NTP server). The default, *pool.ntp.org*, is a publicly maintained time server and should be adequate.
19 |
20 | #### Timezone
21 | This allows you to set the system time zone.
22 |
23 |
24 | ## RuneOS kernel settings
25 |
26 | #### Linux Kernel
27 |
28 | You can choose from a list of available Linux Kernels to run. You need to reboot the system after chaning this selection in order to run the newly chosen kernel.
29 |
30 | #### I²S kernel modules
31 |
32 | You can enable I²S output by selecting one of the available items in the list. Doing so loads a pre-set collection of modules, specific for each hardware. Once set, the output interface will appear in the MPD (mpd.md) configuration menu. These modules will also auto-load on future reboots.
33 |
34 | #### Sound Signature (optimization profiles)
35 | Each of the profiles includes a set of performance tweaks that act on specific system kernel parameters. They *are not* enabling Digital Signal Processing (DSP) nor any other sound effect - the output remains untouched (bit perfect). By applying settings that act on kernel latency parameters (and probably on the amount of overall jitter), we have found that each of these profiles introduces an audible impact on the overall sound quality.
36 |
37 | The actual sonic results vary depending on the other equipment in use in your system, as well as the acoustic properties of the room itself. So, we invite you to experiment and ultimately choose a profile according to your personal taste. (If you can't hear any differences... don't worry, they are subtle. You can safely use the default settings.)
38 |
39 | ## Features management
40 | You can Enable/Disable optional modules to best suit your needs. Disabling unused features will free system resources and might improve the overall performance. Enabling them allows you to use them. The choice is yours.
41 |
42 | #### AirPlay
43 |
44 | The AirPlay setting allows you to toggle the capability of receiving wireless streaming of audio via the AirPlay protocol.
45 |
46 | - When enabled, you must configure the AirPlay name for this device.
47 |
48 | #### Spotify
49 |
50 | The Spotify setting allows you to enable the built-in Spotify client [EXPERIMENTAL]. You must have a Spotify PREMIUM account to use this feature.
51 |
52 | - When enabled, you must provide your Spotify Username and Password.
53 |
54 | #### UPnP / DLNA
55 |
56 | The UPnP / DLNA setting allows you to toggle the capability of receiving wireless streaming of audio via the UPnP / DLNA protocol.
57 |
58 | - When enabled, you must configure the UPnP / DLNA name for this device.
59 |
60 |
61 | #### USB Automount
62 |
63 | The USB Automount setting allows you to toggle the feature to automatically detect and mount connected USB drives.
64 |
65 | #### Last.fm
66 |
67 | The Last.fm setting allows you to send information to Last.fm about the music you are listening to (requires a Last.fm account).
68 |
69 | - When enabled, you must provide your Last.fm Username and Password.
70 |
71 | ## Compatibility fixes
72 | Some receivers and DACs use CMedia components that suffer from audible glitches (noise, crackling) when changing between tracks with different sample rates and/or bit depth.
73 |
74 | This setting allows you to toggle the application of a fix for the *CM6631 receiver* related issues. It is not recommended to use this fix if you do not experience issues with this setting turned off.
75 |
76 | ## Backup / Restore configuration
77 |
78 | The Backup feature makes a copy of your current settings. The restore feature allows you to easily apply those saved setting by either transferring them between multiple RuneAudio installations, or applying them to a new/upgrade installation.
79 |
80 | NOTE: the restore feature will be available in 0.4 release.
81 |
82 |
--------------------------------------------------------------------------------
/docs/runeui/sources.md:
--------------------------------------------------------------------------------
1 | # Sources
2 |
3 | > [MENU] Menu > Sources
4 |
5 | The Local Sources screen allows you to configure the locally connected data sources containing your audio files. Both Network Attached Storage (NAS) and USB storage can be configured on this screen.
6 |
7 | The "Rebuild MPD Library" button refreshes the content of your MPD music library by reading again the contents of your Network and USB Mounts.
8 |
9 | ## Network Mounts
10 |
11 | This section lists all Network Attached Storage (NAS) configured for your device.
12 |
13 | Clicking "Add new mount" allows you to configure a new Network Mount. When adding a new mount, complete the following fields:
14 |
15 | #### Source name
16 |
17 | This is the name you want to give to this source. It will appear in your Library with this name.
18 |
19 | #### File-share protocol
20 |
21 | The following options are available for the type of file-share to which you are connecting:
22 |
23 | - SMB/CIFS: select this for connecting to a Windows file share
24 | - SMB/CIFS (OS X): select this for connecting to an OS X file share
25 | - NFS: select this option for connecting to a unix file share
26 |
27 | #### IP address
28 |
29 | Enter the IP Address (or name) of the NAS device to which you wish to connect.
30 |
31 | #### Remote directory
32 |
33 | Specify the directory name of the shared folder on the NAS where your music files are stored. (NOTE: the directory name is case sensitive)
34 |
35 | #### Guest access
36 |
37 | Guest access allows you to connect to a shared folder without a username / password. If your NAS requires you to use login credentials, disable guest access (set it to "Off") and enter the Username and Password.
38 |
39 |
40 | #### Advanced Options
41 |
42 | This setting toggles the visibility of the advanced mount options.
43 |
44 | ## Advanced Options
45 |
46 | When enabled, additional settings are available for configuring your connection to your NAS device.
47 |
48 | #### Charset
49 |
50 | Change this setting if you experience problems with character encoding.
51 |
52 | #### Rsize
53 |
54 | Change this setting if you experience problems with music playback (e.g. pops or clicks).
55 |
56 | #### Wsize
57 |
58 | Change this setting if you experience problems with music playback (e.g. pops or clicks).
59 |
60 | #### Mount flags
61 |
62 | You can configure advanced mount flags here. However, we suggest you don't use this field unless you know exactly what you are doing.
63 |
64 |
65 | ## USB
66 |
67 |
--------------------------------------------------------------------------------
/docs/troubleshooting/common-troubleshooting.md:
--------------------------------------------------------------------------------
1 | # Common troubleshooting
--------------------------------------------------------------------------------
/docs/troubleshooting/extend-partition-sd.md:
--------------------------------------------------------------------------------
1 | # Extend a partition
2 |
3 | RuneAudio is commonly distributed in system images which will fit on 2GB SD cards. The default partition sizes are limited to that total amount, so if you are using a bigger SD card you will probably want to take advantage of all the space available.
4 |
5 | ## Make use of unused space on a SD card
6 |
7 | A command which may be of interest to make use of unused space on the SD card is **resize2fs**.
8 | This resizes the filesystem, and can be used while the filesystem is online (i.e. no need to unmount it).
9 |
10 | First you have to use **fdisk** to resize the partition to fill the whole SD card. You can do this by doing:
11 |
12 | fdisk /dev/mmcblk0
13 |
14 | 1. Press "**p**" to show the current partitions and note down the details of the main one that RuneOS is on.
15 | 2. Delete it, pressing "**d**" and choosing the relevant partition number.
16 | 3. Press "**n**" to make a new partition, and "**p**" to select a primary partition. Enter the same start block that you wrote down above, and allow it to use the default end block (the last block available on the device).
17 | 4. Press "**t**" and enter the value "83" to mark it as a Linux partition.
18 | 5. Press "**w**" to write changes and exit. You may have to reboot after this for changes to be registered. This has resized the partition, but not yet the filesystem.
19 |
20 | Next, use the **resize2fs** command in this way:
21 |
22 | resize2fs /dev/mmcblk0p0
23 |
24 | (or `/dev/mmcblk0p1` if the main RuneOS partition was `mmcblk0p1`).
25 | This will resize the filesystem to fill the whole partition, and you will have a lot more space available for stuff.
26 |
--------------------------------------------------------------------------------
/docs/troubleshooting/updating.md:
--------------------------------------------------------------------------------
1 | # Getting updates
2 |
3 | ##Standard updates
4 |
5 | Major releases are distributed via [downloadable disk images](http://www.runeaudio.com/download/). In between major releases, we publish bugfixes and new features to [our official repository on GitHub](https://github.com/RuneAudio/RuneUI). They are located on the **main** branch (the production one).
6 |
7 | You can check for and install these updates from the UI:
8 |
9 | 1. go to the **dev section** of the UI, typing [http://runeaudio/dev](http://runeaudio/dev) or [http://runeaudio.local/dev](http://runeaudio.local/dev) in your browser
10 | 2. set the **Dev Mode** to **enabled**
11 | 3. click the **gitpull** button (*Update RuneUI*)
12 | 4. hard refresh the cache of your browser ([howto](http://www.refreshyourcache.com/en/cache/))
13 |
14 | Alternatively, you can do this from the terminal:
15 |
16 | cd /var/www
17 | git pull
18 | curl -s -X GET 'http://localhost/clear'
19 |
20 | As final step, always remember to hard refresh the cache of your browser. ([howto](http://www.refreshyourcache.com/en/cache/))
21 |
22 | ##Nightly builds
23 |
24 | Nightly builds are based on the latest development code, which means they are probably unstable and definitely not documented. As such, your mileage may vary.
25 |
26 | Updating to these builds is better suited for more experienced users and developers, although everyone is welcome to test them and provide feedback.
27 |
28 | Currently, development is progressing along different branches in the RuneUI repository:
29 | [dev branch](https://github.com/RuneAudio/RuneUI/tree/dev) - closer to the main branch, this is likely to be merged with main on a regualr basis
30 | [next branch](https://github.com/RuneAudio/RuneUI/tree/next) - a more experimental one, typically intended to be the next version of RuneAudio
31 |
32 | These are the required steps to switch from the main branch to another one (the following example refers to the *dev* branch):
33 |
34 | 1. delete the contents of /var/www (including hidden files)
35 | **DOUBLE CHECK the path before entering the command!**
36 |
37 | `rm -rf /var/www/{*,.*}`
38 |
39 | 2. clone the 'dev' branch on your device (notice the `-b dev`)
40 |
41 | `git clone -b dev https://github.com/RuneAudio/RuneUI.git/ /var/www`
42 |
43 | 3. clear the PHP OPcache
44 |
45 | `curl -s http://localhost/clear`
46 |
47 | 4. reboot your device
48 |
49 | As final step, always remember to hard refresh the cache of your browser. ([howto](http://www.refreshyourcache.com/en/cache/))
50 |
--------------------------------------------------------------------------------
/mkdocs.yml:
--------------------------------------------------------------------------------
1 | site_name: RuneAudio
2 | site_url: http://www.runeaudio.com/documentation/
3 | site_description: 'RuneAudio documentation - Free and open source Hi-Fi music player for embedded hardware.'
4 | site_author: 'Andrea Coiutti (ACX)'
5 | site_favicon: favicon.ico
6 | repo_url: https://github.com/RuneAudio/Docs/
7 | theme_dir: 'runeaudio_theme'
8 | dev_addr: 127.0.0.1:8080
9 |
10 | pages:
11 | - ['index.md', 'Docs']
12 | - ['quick-start\quick-start-guide.md', 'Quick start', 'Quick start guide']
13 | - ['quick-start\sd-card-setup-windows.md', 'Quick start', 'Flashing the SD Card using Windows']
14 | - ['quick-start\sd-card-setup-mac.md', 'Quick start', 'Flashing the SD Card using Mac']
15 | - ['quick-start\sd-card-setup-linux.md', 'Quick start', 'Flashing the SD Card using Linux']
16 | - ['quick-start\rpi-hardware-setup.md', 'Quick start', 'Raspberry Pi hardware setup']
17 | - ['runeui\runeui.md', 'RuneUI', 'RuneUI']
18 | - ['runeui\playback.md', 'RuneUI', 'Playback']
19 | - ['runeui\sources.md', 'RuneUI', 'Sources']
20 | - ['runeui\mpd.md', 'RuneUI', 'MPD']
21 | - ['runeui\settings.md', 'RuneUI', 'Settings']
22 | - ['runeui\network.md', 'RuneUI', 'Network']
23 | - ['runeui\debug.md', 'RuneUI', 'Debug']
24 | - ['troubleshooting\common-troubleshooting.md', 'Troubleshoot', 'Common troubleshooting']
25 | - ['troubleshooting\rpi-troubleshooting.md', 'Troubleshoot', 'Raspberry Pi troubleshooting']
26 | - ['troubleshooting\extend-partition-sd.md', 'Troubleshoot', 'Extend a partition']
27 | - ['troubleshooting\updating.md', 'Troubleshoot', 'Getting updates']
28 | - ['development\contribute.md', 'Dev', 'Contribute']
29 | - ['development\runeaudio-remote-control.md', 'Dev', 'RuneAudio Remote Control']
--------------------------------------------------------------------------------
/runeaudio_theme/.jshintrc:
--------------------------------------------------------------------------------
1 | {
2 | "bitwise": true,
3 | "browser": true,
4 | "curly": true,
5 | "eqeqeq": true,
6 | "eqnull": true,
7 | "esnext": true,
8 | "immed": true,
9 | "jquery": true,
10 | "latedef": true,
11 | "newcap": true,
12 | "noarg": true,
13 | "node": true,
14 | "strict": false,
15 | "trailing": true
16 | }
17 |
--------------------------------------------------------------------------------
/runeaudio_theme/Gruntfile.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | module.exports = function(grunt) {
3 |
4 | grunt.initConfig({
5 | jshint: {
6 | options: {
7 | jshintrc: '.jshintrc'
8 | },
9 | all: [
10 | 'Gruntfile.js',
11 | 'assets/js/*.js',
12 | '!assets/js/scripts.min.js'
13 | ]
14 | },
15 | less: {
16 | dist: {
17 | files: {
18 | 'assets/css/main.min.css': [
19 | 'assets/less/app.less'
20 | ]
21 | },
22 | options: {
23 | compress: true,
24 | // LESS source map
25 | // To enable, set sourceMap to true and update sourceMapRootpath based on your install
26 | sourceMap: false,
27 | sourceMapFilename: 'assets/css/main.min.css.map',
28 | sourceMapRootpath: '/app/themes/roots/'
29 | }
30 | }
31 | },
32 | uglify: {
33 | dist: {
34 | files: {
35 | 'assets/js/scripts.min.js': [
36 | 'assets/js/plugins/bootstrap/transition.js',
37 | 'assets/js/plugins/bootstrap/alert.js',
38 | 'assets/js/plugins/bootstrap/button.js',
39 | 'assets/js/plugins/bootstrap/carousel.js',
40 | 'assets/js/plugins/bootstrap/collapse.js',
41 | 'assets/js/plugins/bootstrap/dropdown.js',
42 | 'assets/js/plugins/bootstrap/modal.js',
43 | 'assets/js/plugins/bootstrap/tooltip.js',
44 | 'assets/js/plugins/bootstrap/popover.js',
45 | 'assets/js/plugins/bootstrap/scrollspy.js',
46 | 'assets/js/plugins/bootstrap/tab.js',
47 | 'assets/js/plugins/bootstrap/affix.js',
48 | 'assets/js/plugins/*.js',
49 | 'assets/js/_*.js'
50 | ]
51 | },
52 | options: {
53 | }
54 | }
55 | },
56 | watch: {
57 | less: {
58 | files: [
59 | 'assets/less/*.less',
60 | 'assets/less/bootstrap/*.less'
61 | ],
62 | tasks: ['less']
63 | },
64 | js: {
65 | files: [
66 | '<%= jshint.all %>'
67 | ],
68 | tasks: ['jshint', 'uglify']
69 | },
70 | livereload: {
71 | // Browser live reloading
72 | // https://github.com/gruntjs/grunt-contrib-watch#live-reloading
73 | options: {
74 | livereload: true
75 | },
76 | files: [
77 | 'assets/css/main.min.css',
78 | 'assets/js/scripts.min.js',
79 | 'templates/*.php',
80 | '*.php'
81 | ]
82 | }
83 | },
84 | clean: {
85 | dist: [
86 | 'assets/css/main.min.css',
87 | 'assets/js/scripts.min.js'
88 | ]
89 | }
90 | });
91 |
92 | // Load tasks
93 | grunt.loadNpmTasks('grunt-contrib-clean');
94 | grunt.loadNpmTasks('grunt-contrib-jshint');
95 | grunt.loadNpmTasks('grunt-contrib-uglify');
96 | grunt.loadNpmTasks('grunt-contrib-watch');
97 | grunt.loadNpmTasks('grunt-contrib-less');
98 |
99 | // Register tasks
100 | grunt.registerTask('default', [
101 | 'clean',
102 | 'less',
103 | 'uglify'
104 | ]);
105 | grunt.registerTask('dev', [
106 | 'watch'
107 | ]);
108 |
109 | };
110 |
--------------------------------------------------------------------------------
/runeaudio_theme/assets/css/base.css:
--------------------------------------------------------------------------------
1 | body {
2 | padding-top: 70px;
3 | }
4 |
5 | ul.nav li.main {
6 | font-weight: bold;
7 | }
8 |
9 | div.col-md-3 {
10 | padding-left: 0;
11 | }
12 |
13 | div.source-links {
14 | float: right;
15 | }
16 |
17 | /*
18 | * Side navigation
19 | *
20 | * Scrollspy and affixed enhanced navigation to highlight sections and secondary
21 | * sections of docs content.
22 | */
23 |
24 | /* By default it's not affixed in mobile views, so undo that */
25 | .bs-sidebar.affix {
26 | position: static;
27 | }
28 |
29 | .bs-sidebar.well {
30 | padding: 0;
31 | }
32 |
33 | /* First level of nav */
34 | .bs-sidenav {
35 | margin-top: 30px;
36 | margin-bottom: 30px;
37 | padding-top: 10px;
38 | padding-bottom: 10px;
39 | border-radius: 5px;
40 | }
41 |
42 | /* All levels of nav */
43 | .bs-sidebar .nav > li > a {
44 | display: block;
45 | padding: 5px 20px;
46 | }
47 | .bs-sidebar .nav > li > a:hover,
48 | .bs-sidebar .nav > li > a:focus {
49 | text-decoration: none;
50 | border-right: 1px solid;
51 | }
52 | .bs-sidebar .nav > .active > a,
53 | .bs-sidebar .nav > .active:hover > a,
54 | .bs-sidebar .nav > .active:focus > a {
55 | font-weight: bold;
56 | background-color: transparent;
57 | border-right: 1px solid;
58 | }
59 |
60 | /* Nav: second level (shown on .active) */
61 | .bs-sidebar .nav .nav {
62 | display: none; /* Hide by default, but at >768px, show it */
63 | margin-bottom: 8px;
64 | }
65 | .bs-sidebar .nav .nav > li > a {
66 | padding-top: 3px;
67 | padding-bottom: 3px;
68 | padding-left: 30px;
69 | font-size: 90%;
70 | }
71 |
72 | /* Show and affix the side nav when space allows it */
73 | @media (min-width: 992px) {
74 | .bs-sidebar .nav > .active > ul {
75 | display: block;
76 | }
77 | /* Widen the fixed sidebar */
78 | .bs-sidebar.affix,
79 | .bs-sidebar.affix-bottom {
80 | width: 213px;
81 | }
82 | .bs-sidebar.affix {
83 | position: fixed; /* Undo the static from mobile first approach */
84 | top: 80px;
85 | }
86 | .bs-sidebar.affix-bottom {
87 | position: absolute; /* Undo the static from mobile first approach */
88 | }
89 | .bs-sidebar.affix-bottom .bs-sidenav,
90 | .bs-sidebar.affix .bs-sidenav {
91 | margin-top: 0;
92 | margin-bottom: 0;
93 | }
94 | }
95 | @media (min-width: 1200px) {
96 | /* Widen the fixed sidebar again */
97 | .bs-sidebar.affix-bottom,
98 | .bs-sidebar.affix {
99 | width: 263px;
100 | }
101 | }
--------------------------------------------------------------------------------
/runeaudio_theme/assets/css/prettify-1.0.css:
--------------------------------------------------------------------------------
1 | .com { color: #93a1a1; }
2 | .lit { color: #195f91; }
3 | .pun, .opn, .clo { color: #93a1a1; }
4 | .fun { color: #dc322f; }
5 | .str, .atv { color: #D14; }
6 | .kwd, .prettyprint .tag { color: #1e347b; }
7 | .typ, .atn, .dec, .var { color: teal; }
8 | .pln { color: #48484c; }
9 |
10 | .prettyprint {
11 | padding: 8px;
12 | }
13 | .prettyprint.linenums {
14 | -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;
15 | -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;
16 | box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;
17 | }
18 |
19 | /* Specify class=linenums on a pre to get line numbering */
20 | ol.linenums {
21 | margin: 0 0 0 33px; /* IE indents via margin-left */
22 | }
23 | ol.linenums li {
24 | padding-left: 12px;
25 | color: #bebec5;
26 | line-height: 20px;
27 | text-shadow: 0 1px 0 #fff;
28 | }
29 |
--------------------------------------------------------------------------------
/runeaudio_theme/assets/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RuneAudio/Docs/a5546e1f1f276ff583a80511b9b5eae9894d9ec2/runeaudio_theme/assets/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/runeaudio_theme/assets/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RuneAudio/Docs/a5546e1f1f276ff583a80511b9b5eae9894d9ec2/runeaudio_theme/assets/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/runeaudio_theme/assets/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RuneAudio/Docs/a5546e1f1f276ff583a80511b9b5eae9894d9ec2/runeaudio_theme/assets/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/runeaudio_theme/assets/img/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RuneAudio/Docs/a5546e1f1f276ff583a80511b9b5eae9894d9ec2/runeaudio_theme/assets/img/favicon.ico
--------------------------------------------------------------------------------
/runeaudio_theme/assets/js/_scripts.js:
--------------------------------------------------------------------------------
1 | //= document.body.offsetHeight
40 | );
41 | if (!scrolledToBottomOfPage) {
42 | scrollBy(0, -60);
43 | }
44 | }
45 | };
46 | if (location.hash) { shiftWindow(); }
47 | window.addEventListener('hashchange', shiftWindow);
48 |
49 |
50 | /* Deal with clicks on nav links that do not change the current anchor link. */
51 | $('ul.nav a').click(function() {
52 | var href = this.href;
53 | var suffix = location.hash;
54 | var matchesCurrentHash = (href.indexOf(suffix, href.length - suffix.length) !== -1);
55 | if (location.hash && matchesCurrentHash) {
56 | /* Force a single 'hashchange' event to occur after the click event */
57 | window.disableShift = true;
58 | location.hash='';
59 | }
60 | });
61 |
62 | // transform H5 tags into Bootstrap's alerts
63 | $('blockquote:contains("[INFO]")').addClass('alert alert-info').html(function(){
64 | return $(this).find('p').html().substring(7);
65 | });
66 | $('blockquote:contains("[WARNING]")').addClass('alert alert-warning').html(function(){
67 | return $(this).find('p').html().substring(10);
68 | });
69 | $('blockquote:contains("[MENU]")').addClass('alert alert-menu').html(function(){
70 | return $(this).find('p').html().substring(7);
71 | });
72 |
73 | // set width of the parent div
74 | function sidebarResize() {
75 | $('.bs-sidebar').each(function(){
76 | $(this).width($(this).parent().width());
77 | });
78 | }
79 | sidebarResize();
80 | $(window).on('resize', function() {
81 | sidebarResize();
82 | });
83 |
84 | // edit page on GitHub link
85 | var canonical = $('link[rel=canonical]').attr('href');
86 | if (canonical === 'http://www.runeaudio.com/documentation/') {
87 | // documentation home page
88 | canonical = 'https://github.com/RuneAudio/Docs/blob/master/docs/index.md';
89 | } else {
90 | // other pages
91 | canonical = canonical.replace('http://www.runeaudio.com/documentation/', 'https://github.com/RuneAudio/Docs/blob/master/docs/');
92 | canonical = canonical.slice(0,-1);
93 | canonical += '.md';
94 | }
95 | $('#contribute-edit').attr('href', canonical);
96 |
97 | }); //]]>
--------------------------------------------------------------------------------
/runeaudio_theme/assets/js/plugins/bootstrap/affix.js:
--------------------------------------------------------------------------------
1 | /* ========================================================================
2 | * Bootstrap: affix.js v3.1.1
3 | * http://getbootstrap.com/javascript/#affix
4 | * ========================================================================
5 | * Copyright 2011-2014 Twitter, Inc.
6 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7 | * ======================================================================== */
8 |
9 |
10 | +function ($) {
11 | 'use strict';
12 |
13 | // AFFIX CLASS DEFINITION
14 | // ======================
15 |
16 | var Affix = function (element, options) {
17 | this.options = $.extend({}, Affix.DEFAULTS, options)
18 | this.$window = $(window)
19 | .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
20 | .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
21 |
22 | this.$element = $(element)
23 | this.affixed =
24 | this.unpin =
25 | this.pinnedOffset = null
26 |
27 | this.checkPosition()
28 | }
29 |
30 | Affix.RESET = 'affix affix-top affix-bottom'
31 |
32 | Affix.DEFAULTS = {
33 | offset: 0
34 | }
35 |
36 | Affix.prototype.getPinnedOffset = function () {
37 | if (this.pinnedOffset) return this.pinnedOffset
38 | this.$element.removeClass(Affix.RESET).addClass('affix')
39 | var scrollTop = this.$window.scrollTop()
40 | var position = this.$element.offset()
41 | return (this.pinnedOffset = position.top - scrollTop)
42 | }
43 |
44 | Affix.prototype.checkPositionWithEventLoop = function () {
45 | setTimeout($.proxy(this.checkPosition, this), 1)
46 | }
47 |
48 | Affix.prototype.checkPosition = function () {
49 | if (!this.$element.is(':visible')) return
50 |
51 | var scrollHeight = $(document).height()
52 | var scrollTop = this.$window.scrollTop()
53 | var position = this.$element.offset()
54 | var offset = this.options.offset
55 | var offsetTop = offset.top
56 | var offsetBottom = offset.bottom
57 |
58 | if (this.affixed == 'top') position.top += scrollTop
59 |
60 | if (typeof offset != 'object') offsetBottom = offsetTop = offset
61 | if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
62 | if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
63 |
64 | var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false :
65 | offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
66 | offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false
67 |
68 | if (this.affixed === affix) return
69 | if (this.unpin) this.$element.css('top', '')
70 |
71 | var affixType = 'affix' + (affix ? '-' + affix : '')
72 | var e = $.Event(affixType + '.bs.affix')
73 |
74 | this.$element.trigger(e)
75 |
76 | if (e.isDefaultPrevented()) return
77 |
78 | this.affixed = affix
79 | this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
80 |
81 | this.$element
82 | .removeClass(Affix.RESET)
83 | .addClass(affixType)
84 | .trigger($.Event(affixType.replace('affix', 'affixed')))
85 |
86 | if (affix == 'bottom') {
87 | this.$element.offset({ top: scrollHeight - offsetBottom - this.$element.height() })
88 | }
89 | }
90 |
91 |
92 | // AFFIX PLUGIN DEFINITION
93 | // =======================
94 |
95 | var old = $.fn.affix
96 |
97 | $.fn.affix = function (option) {
98 | return this.each(function () {
99 | var $this = $(this)
100 | var data = $this.data('bs.affix')
101 | var options = typeof option == 'object' && option
102 |
103 | if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
104 | if (typeof option == 'string') data[option]()
105 | })
106 | }
107 |
108 | $.fn.affix.Constructor = Affix
109 |
110 |
111 | // AFFIX NO CONFLICT
112 | // =================
113 |
114 | $.fn.affix.noConflict = function () {
115 | $.fn.affix = old
116 | return this
117 | }
118 |
119 |
120 | // AFFIX DATA-API
121 | // ==============
122 |
123 | $(window).on('load', function () {
124 | $('[data-spy="affix"]').each(function () {
125 | var $spy = $(this)
126 | var data = $spy.data()
127 |
128 | data.offset = data.offset || {}
129 |
130 | if (data.offsetBottom) data.offset.bottom = data.offsetBottom
131 | if (data.offsetTop) data.offset.top = data.offsetTop
132 |
133 | $spy.affix(data)
134 | })
135 | })
136 |
137 | }(jQuery);
138 |
--------------------------------------------------------------------------------
/runeaudio_theme/assets/js/plugins/bootstrap/alert.js:
--------------------------------------------------------------------------------
1 | /* ========================================================================
2 | * Bootstrap: alert.js v3.1.1
3 | * http://getbootstrap.com/javascript/#alerts
4 | * ========================================================================
5 | * Copyright 2011-2014 Twitter, Inc.
6 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7 | * ======================================================================== */
8 |
9 |
10 | +function ($) {
11 | 'use strict';
12 |
13 | // ALERT CLASS DEFINITION
14 | // ======================
15 |
16 | var dismiss = '[data-dismiss="alert"]'
17 | var Alert = function (el) {
18 | $(el).on('click', dismiss, this.close)
19 | }
20 |
21 | Alert.prototype.close = function (e) {
22 | var $this = $(this)
23 | var selector = $this.attr('data-target')
24 |
25 | if (!selector) {
26 | selector = $this.attr('href')
27 | selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
28 | }
29 |
30 | var $parent = $(selector)
31 |
32 | if (e) e.preventDefault()
33 |
34 | if (!$parent.length) {
35 | $parent = $this.hasClass('alert') ? $this : $this.parent()
36 | }
37 |
38 | $parent.trigger(e = $.Event('close.bs.alert'))
39 |
40 | if (e.isDefaultPrevented()) return
41 |
42 | $parent.removeClass('in')
43 |
44 | function removeElement() {
45 | $parent.trigger('closed.bs.alert').remove()
46 | }
47 |
48 | $.support.transition && $parent.hasClass('fade') ?
49 | $parent
50 | .one($.support.transition.end, removeElement)
51 | .emulateTransitionEnd(150) :
52 | removeElement()
53 | }
54 |
55 |
56 | // ALERT PLUGIN DEFINITION
57 | // =======================
58 |
59 | var old = $.fn.alert
60 |
61 | $.fn.alert = function (option) {
62 | return this.each(function () {
63 | var $this = $(this)
64 | var data = $this.data('bs.alert')
65 |
66 | if (!data) $this.data('bs.alert', (data = new Alert(this)))
67 | if (typeof option == 'string') data[option].call($this)
68 | })
69 | }
70 |
71 | $.fn.alert.Constructor = Alert
72 |
73 |
74 | // ALERT NO CONFLICT
75 | // =================
76 |
77 | $.fn.alert.noConflict = function () {
78 | $.fn.alert = old
79 | return this
80 | }
81 |
82 |
83 | // ALERT DATA-API
84 | // ==============
85 |
86 | $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
87 |
88 | }(jQuery);
89 |
--------------------------------------------------------------------------------
/runeaudio_theme/assets/js/plugins/bootstrap/button.js:
--------------------------------------------------------------------------------
1 | /* ========================================================================
2 | * Bootstrap: button.js v3.1.1
3 | * http://getbootstrap.com/javascript/#buttons
4 | * ========================================================================
5 | * Copyright 2011-2014 Twitter, Inc.
6 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7 | * ======================================================================== */
8 |
9 |
10 | +function ($) {
11 | 'use strict';
12 |
13 | // BUTTON PUBLIC CLASS DEFINITION
14 | // ==============================
15 |
16 | var Button = function (element, options) {
17 | this.$element = $(element)
18 | this.options = $.extend({}, Button.DEFAULTS, options)
19 | this.isLoading = false
20 | }
21 |
22 | Button.DEFAULTS = {
23 | loadingText: 'loading...'
24 | }
25 |
26 | Button.prototype.setState = function (state) {
27 | var d = 'disabled'
28 | var $el = this.$element
29 | var val = $el.is('input') ? 'val' : 'html'
30 | var data = $el.data()
31 |
32 | state = state + 'Text'
33 |
34 | if (!data.resetText) $el.data('resetText', $el[val]())
35 |
36 | $el[val](data[state] || this.options[state])
37 |
38 | // push to event loop to allow forms to submit
39 | setTimeout($.proxy(function () {
40 | if (state == 'loadingText') {
41 | this.isLoading = true
42 | $el.addClass(d).attr(d, d)
43 | } else if (this.isLoading) {
44 | this.isLoading = false
45 | $el.removeClass(d).removeAttr(d)
46 | }
47 | }, this), 0)
48 | }
49 |
50 | Button.prototype.toggle = function () {
51 | var changed = true
52 | var $parent = this.$element.closest('[data-toggle="buttons"]')
53 |
54 | if ($parent.length) {
55 | var $input = this.$element.find('input')
56 | if ($input.prop('type') == 'radio') {
57 | if ($input.prop('checked') && this.$element.hasClass('active')) changed = false
58 | else $parent.find('.active').removeClass('active')
59 | }
60 | if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
61 | }
62 |
63 | if (changed) this.$element.toggleClass('active')
64 | }
65 |
66 |
67 | // BUTTON PLUGIN DEFINITION
68 | // ========================
69 |
70 | var old = $.fn.button
71 |
72 | $.fn.button = function (option) {
73 | return this.each(function () {
74 | var $this = $(this)
75 | var data = $this.data('bs.button')
76 | var options = typeof option == 'object' && option
77 |
78 | if (!data) $this.data('bs.button', (data = new Button(this, options)))
79 |
80 | if (option == 'toggle') data.toggle()
81 | else if (option) data.setState(option)
82 | })
83 | }
84 |
85 | $.fn.button.Constructor = Button
86 |
87 |
88 | // BUTTON NO CONFLICT
89 | // ==================
90 |
91 | $.fn.button.noConflict = function () {
92 | $.fn.button = old
93 | return this
94 | }
95 |
96 |
97 | // BUTTON DATA-API
98 | // ===============
99 |
100 | $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {
101 | var $btn = $(e.target)
102 | if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
103 | $btn.button('toggle')
104 | e.preventDefault()
105 | })
106 |
107 | }(jQuery);
108 |
--------------------------------------------------------------------------------
/runeaudio_theme/assets/js/plugins/bootstrap/collapse.js:
--------------------------------------------------------------------------------
1 | /* ========================================================================
2 | * Bootstrap: collapse.js v3.1.1
3 | * http://getbootstrap.com/javascript/#collapse
4 | * ========================================================================
5 | * Copyright 2011-2014 Twitter, Inc.
6 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7 | * ======================================================================== */
8 |
9 |
10 | +function ($) {
11 | 'use strict';
12 |
13 | // COLLAPSE PUBLIC CLASS DEFINITION
14 | // ================================
15 |
16 | var Collapse = function (element, options) {
17 | this.$element = $(element)
18 | this.options = $.extend({}, Collapse.DEFAULTS, options)
19 | this.transitioning = null
20 |
21 | if (this.options.parent) this.$parent = $(this.options.parent)
22 | if (this.options.toggle) this.toggle()
23 | }
24 |
25 | Collapse.DEFAULTS = {
26 | toggle: true
27 | }
28 |
29 | Collapse.prototype.dimension = function () {
30 | var hasWidth = this.$element.hasClass('width')
31 | return hasWidth ? 'width' : 'height'
32 | }
33 |
34 | Collapse.prototype.show = function () {
35 | if (this.transitioning || this.$element.hasClass('in')) return
36 |
37 | var startEvent = $.Event('show.bs.collapse')
38 | this.$element.trigger(startEvent)
39 | if (startEvent.isDefaultPrevented()) return
40 |
41 | var actives = this.$parent && this.$parent.find('> .panel > .in')
42 |
43 | if (actives && actives.length) {
44 | var hasData = actives.data('bs.collapse')
45 | if (hasData && hasData.transitioning) return
46 | actives.collapse('hide')
47 | hasData || actives.data('bs.collapse', null)
48 | }
49 |
50 | var dimension = this.dimension()
51 |
52 | this.$element
53 | .removeClass('collapse')
54 | .addClass('collapsing')
55 | [dimension](0)
56 |
57 | this.transitioning = 1
58 |
59 | var complete = function () {
60 | this.$element
61 | .removeClass('collapsing')
62 | .addClass('collapse in')
63 | [dimension]('auto')
64 | this.transitioning = 0
65 | this.$element.trigger('shown.bs.collapse')
66 | }
67 |
68 | if (!$.support.transition) return complete.call(this)
69 |
70 | var scrollSize = $.camelCase(['scroll', dimension].join('-'))
71 |
72 | this.$element
73 | .one($.support.transition.end, $.proxy(complete, this))
74 | .emulateTransitionEnd(350)
75 | [dimension](this.$element[0][scrollSize])
76 | }
77 |
78 | Collapse.prototype.hide = function () {
79 | if (this.transitioning || !this.$element.hasClass('in')) return
80 |
81 | var startEvent = $.Event('hide.bs.collapse')
82 | this.$element.trigger(startEvent)
83 | if (startEvent.isDefaultPrevented()) return
84 |
85 | var dimension = this.dimension()
86 |
87 | this.$element
88 | [dimension](this.$element[dimension]())
89 | [0].offsetHeight
90 |
91 | this.$element
92 | .addClass('collapsing')
93 | .removeClass('collapse')
94 | .removeClass('in')
95 |
96 | this.transitioning = 1
97 |
98 | var complete = function () {
99 | this.transitioning = 0
100 | this.$element
101 | .trigger('hidden.bs.collapse')
102 | .removeClass('collapsing')
103 | .addClass('collapse')
104 | }
105 |
106 | if (!$.support.transition) return complete.call(this)
107 |
108 | this.$element
109 | [dimension](0)
110 | .one($.support.transition.end, $.proxy(complete, this))
111 | .emulateTransitionEnd(350)
112 | }
113 |
114 | Collapse.prototype.toggle = function () {
115 | this[this.$element.hasClass('in') ? 'hide' : 'show']()
116 | }
117 |
118 |
119 | // COLLAPSE PLUGIN DEFINITION
120 | // ==========================
121 |
122 | var old = $.fn.collapse
123 |
124 | $.fn.collapse = function (option) {
125 | return this.each(function () {
126 | var $this = $(this)
127 | var data = $this.data('bs.collapse')
128 | var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
129 |
130 | if (!data && options.toggle && option == 'show') option = !option
131 | if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
132 | if (typeof option == 'string') data[option]()
133 | })
134 | }
135 |
136 | $.fn.collapse.Constructor = Collapse
137 |
138 |
139 | // COLLAPSE NO CONFLICT
140 | // ====================
141 |
142 | $.fn.collapse.noConflict = function () {
143 | $.fn.collapse = old
144 | return this
145 | }
146 |
147 |
148 | // COLLAPSE DATA-API
149 | // =================
150 |
151 | $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {
152 | var $this = $(this), href
153 | var target = $this.attr('data-target')
154 | || e.preventDefault()
155 | || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
156 | var $target = $(target)
157 | var data = $target.data('bs.collapse')
158 | var option = data ? 'toggle' : $this.data()
159 | var parent = $this.attr('data-parent')
160 | var $parent = parent && $(parent)
161 |
162 | if (!data || !data.transitioning) {
163 | if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed')
164 | $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
165 | }
166 |
167 | $target.collapse(option)
168 | })
169 |
170 | }(jQuery);
171 |
--------------------------------------------------------------------------------
/runeaudio_theme/assets/js/plugins/bootstrap/dropdown.js:
--------------------------------------------------------------------------------
1 | /* ========================================================================
2 | * Bootstrap: dropdown.js v3.1.1
3 | * http://getbootstrap.com/javascript/#dropdowns
4 | * ========================================================================
5 | * Copyright 2011-2014 Twitter, Inc.
6 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7 | * ======================================================================== */
8 |
9 |
10 | +function ($) {
11 | 'use strict';
12 |
13 | // DROPDOWN CLASS DEFINITION
14 | // =========================
15 |
16 | var backdrop = '.dropdown-backdrop'
17 | var toggle = '[data-toggle=dropdown]'
18 | var Dropdown = function (element) {
19 | $(element).on('click.bs.dropdown', this.toggle)
20 | }
21 |
22 | Dropdown.prototype.toggle = function (e) {
23 | var $this = $(this)
24 |
25 | if ($this.is('.disabled, :disabled')) return
26 |
27 | var $parent = getParent($this)
28 | var isActive = $parent.hasClass('open')
29 |
30 | clearMenus()
31 |
32 | if (!isActive) {
33 | if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
34 | // if mobile we use a backdrop because click events don't delegate
35 | $('