/**
* Copyright (c) 2014-2017 by the respective copyright holders.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.smarthome.core.audio.internal;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang.ArrayUtils;
import org.eclipse.smarthome.core.audio.AudioException;
import org.eclipse.smarthome.core.audio.AudioManager;
import org.eclipse.smarthome.io.console.Console;
import org.eclipse.smarthome.io.console.extensions.AbstractConsoleCommandExtension;
/**
* Console command extension for all audio features.
*
* @author Karel Goderis - Initial contribution and API
* @author Kai Kreuzer - refactored to match AudioManager implementation
*
*/
public class AudioConsoleCommandExtension extends AbstractConsoleCommandExtension {
private static final String SUBCMD_PLAY = "play";
private static final String SUBCMD_STREAM = "stream";
private static final String SUBCMD_SOURCES = "sources";
private static final String SUBCMD_SINKS = "sinks";
private AudioManager audioManager;
public AudioConsoleCommandExtension() {
super("audio", "Commands around audio enablement features.");
}
@Override
public List<String> getUsages() {
return Arrays.asList(new String[] {
buildCommandUsage(SUBCMD_PLAY + " <sink> <filename>",
"plays a sound file from the sounds folder through the optionally specified audio sink(s)"),
buildCommandUsage(SUBCMD_STREAM + " <sink> <url>",
"streams the sound from the url through the optionally specified audio sink(s)"),
buildCommandUsage(SUBCMD_SOURCES, "lists the audio sources"),
buildCommandUsage(SUBCMD_SINKS, "lists the audio sinks") });
}
@Override
public void execute(String[] args, Console console) {
if (args.length > 0) {
String subCommand = args[0];
switch (subCommand) {
case SUBCMD_PLAY:
if (args.length > 1) {
play((String[]) ArrayUtils.subarray(args, 1, args.length), console);
} else {
console.println(
"Specify file to play, and optionally the sink(s) to use (e.g. 'play javasound hello.mp3')");
}
return;
case SUBCMD_STREAM:
if (args.length > 1) {
stream((String[]) ArrayUtils.subarray(args, 1, args.length), console);
} else {
console.println("Specify url to stream from, and optionally the sink(s) to use");
}
return;
case SUBCMD_SOURCES:
listSources(console);
return;
case SUBCMD_SINKS:
listSinks(console);
return;
default:
break;
}
} else {
printUsage(console);
}
}
private void listSources(Console console) {
if (audioManager.getSourceIds().size() > 0) {
for (String source : audioManager.getSourceIds()) {
console.println(source);
}
} else {
console.println("No audio sources found.");
}
}
private void listSinks(Console console) {
if (audioManager.getSinkIds().size() > 0) {
for (String sink : audioManager.getSinkIds()) {
console.println(sink);
}
} else {
console.println("No audio sinks found.");
}
}
private void play(String[] args, Console console) {
if (args.length == 1) {
try {
audioManager.playFile(args[0]);
} catch (AudioException e) {
console.println(e.getMessage());
}
} else if (args.length == 2) {
Set<String> sinks = audioManager.getSinks(args[0]);
for (String aSink : sinks) {
try {
audioManager.playFile(args[1], aSink);
} catch (AudioException e) {
console.println(e.getMessage());
}
}
}
}
private void stream(String[] args, Console console) {
if (args.length == 1) {
try {
audioManager.stream(args[0]);
} catch (AudioException e) {
console.println(e.getMessage());
}
} else if (args.length == 2) {
Set<String> sinks = audioManager.getSinks(args[0]);
for (String aSink : sinks) {
try {
audioManager.stream(args[1], aSink);
} catch (AudioException e) {
console.println(e.getMessage());
}
}
}
}
protected void setAudioManager(AudioManager audioManager) {
this.audioManager = audioManager;
}
protected void unsetAudioManager(AudioManager audioManager) {
this.audioManager = null;
}
}