r461 - in trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device: . audio gps
Author: fdesbois Date: 2012-08-23 12:21:50 +0200 (Thu, 23 Aug 2012) New Revision: 461 Url: http://forge.codelutin.com/repositories/revision/sammoa/461 Log: Create DeviceManagerProvider and add contract for AudioReader Added: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReader.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReaderMock.java Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java Added: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java (rev 0) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java 2012-08-23 10:21:50 UTC (rev 461) @@ -0,0 +1,182 @@ +package fr.ulr.sammoa.application.device; + +import com.google.common.base.Supplier; +import com.google.common.base.Throwables; +import com.google.common.collect.Sets; +import fr.ulr.sammoa.application.SammoaServiceSupport; +import fr.ulr.sammoa.application.device.audio.AudioReader; +import fr.ulr.sammoa.application.device.audio.AudioReaderMock; +import fr.ulr.sammoa.application.device.audio.AudioRecorder; +import fr.ulr.sammoa.application.device.audio.AudioRecorderDefault; +import fr.ulr.sammoa.application.device.gps.GpsConfig; +import fr.ulr.sammoa.application.device.gps.GpsHandler; +import fr.ulr.sammoa.application.device.gps.GpsLocationListener; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.Set; + +/** + * Created: 21/08/12 + * + * @author fdesbois <florian.desbois@codelutin.com> + */ +public class DeviceManagerProvider extends SammoaServiceSupport { + + protected final Set<DeviceManager> deviceManagers; + + public DeviceManagerProvider() { + deviceManagers = Sets.newHashSet(); + } + + public <T extends DeviceManager> T openDeviceManager(Class<T> deviceManagerClass, boolean autoStart) { + + T result; + if (GpsHandler.class.isAssignableFrom(deviceManagerClass)) { + result = (T) openGpsDevice(context.getConfig().getGpsConfig()); + + } else if (AudioRecorder.class.isAssignableFrom(deviceManagerClass)) { + result = (T) openAudioRecorderDevice(); + + } else if (AudioReader.class.isAssignableFrom(deviceManagerClass)) { + result = (T) openAudioReaderDevice(); + + } else { + throw new IllegalArgumentException("The deviceManager class " + deviceManagerClass.getName() + " is not supported"); + } + + if (autoStart) { + result.start(); + } else { + result.open(); + } + return result; + } + + public <T extends DeviceManager> T getDeviceManager(Class<T> deviceManagerClass) { + for (DeviceManager deviceManager : deviceManagers) { + if (deviceManagerClass.isAssignableFrom(deviceManager.getClass())) { + return (T) deviceManager; + } + } + return null; + } + + public GpsHandler openGpsDevice(final GpsConfig config) throws DeviceTechnicalException { + + GpsHandler oldInstance = getDeviceManager(GpsHandler.class); + + Set<GpsLocationListener> locationListeners; + if (oldInstance != null) { + + // Remove all existing listeners and keep them for the new instance + locationListeners = Sets.newHashSet(oldInstance.getGpsLocationListeners()); + for (GpsLocationListener listener : locationListeners) { + oldInstance.removeGpsLocationListener(listener); + } + + } else { + locationListeners = Sets.newHashSet(); + } + + GpsHandler result = newDeviceManager(oldInstance, new Supplier<GpsHandler>() { + + @Override + public GpsHandler get() { + + // Instanciate the GpsHandler + Class<? extends GpsHandler> gpsHandlerClass = config.getGpsHandlerClass(); + try { + + Constructor<? extends GpsHandler> constructor = + gpsHandlerClass.getConstructor(GpsConfig.class); + + GpsHandler result = constructor.newInstance(config); + return result; + + } catch (InstantiationException e) { + throw Throwables.propagate(e); + } catch (IllegalAccessException e) { + throw Throwables.propagate(e); + } catch (NoSuchMethodException e) { + throw Throwables.propagate(e); + } catch (InvocationTargetException e) { + throw Throwables.propagate(e); + } + } + }); + + for (GpsLocationListener listener : locationListeners) { + result.addGpsLocationListener(listener); + } + return result; + } + + public AudioRecorder openAudioRecorderDevice() throws DeviceTechnicalException { + + AudioRecorder oldInstance = getDeviceManager(AudioRecorder.class); + + AudioRecorder result = newDeviceManager(oldInstance, new Supplier<AudioRecorder>() { + + @Override + public AudioRecorder get() { + return new AudioRecorderDefault(); + } + }); + return result; + } + + public AudioReader openAudioReaderDevice() throws DeviceTechnicalException { + + AudioReader oldInstance = getDeviceManager(AudioReader.class); + + AudioReader result = newDeviceManager(oldInstance, new Supplier<AudioReader>() { + + @Override + public AudioReader get() { + return new AudioReaderMock(); + } + }); + return result; + } + + protected <T extends DeviceManager> T newDeviceManager(T oldInstance, Supplier<T> supplier) + throws DeviceTechnicalException { + + Set<DeviceStateListener> stateListeners; + if (oldInstance != null) { + + // Remove all existing listeners and keep them for the new instance + stateListeners = Sets.newHashSet(oldInstance.getDeviceStateListeners()); + for (DeviceStateListener listener : stateListeners) { + oldInstance.removeDeviceStateListener(listener); + } + + oldInstance.close(); + + deviceManagers.remove(oldInstance); + + } else { + stateListeners = Sets.newHashSet(); + } + + T result = supplier.get(); + + // Attach all updateListener + for (DeviceStateListener listener : stateListeners) { + result.addDeviceStateListener(listener); + } + + deviceManagers.add(result); + + return result; + } + + @Override + public void close() { + for (DeviceManager deviceManager : deviceManagers) { + deviceManager.close(); + } + deviceManagers.clear(); + } +} Property changes on: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Added: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReader.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReader.java (rev 0) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReader.java 2012-08-23 10:21:50 UTC (rev 461) @@ -0,0 +1,30 @@ +package fr.ulr.sammoa.application.device.audio; + +import fr.ulr.sammoa.application.device.DeviceManager; + +import javax.sound.sampled.AudioFileFormat; +import java.io.File; + +/** + * Created: 21/08/12 + * + * @author fdesbois <florian.desbois@codelutin.com> + */ +public interface AudioReader extends DeviceManager { + + /** @return the {@link AudioFileFormat.Type} used (default is WAV) */ + AudioFileFormat.Type getOutputType(); + + /** @param file Audio file to load, then you can call start() and stop() */ + void load(File file); + + /** @return loaded audio in milliseconds or 0 if no audio is loaded */ + long getLength(); + + /** @param position current audio position in milliseconds to set */ + void setPosition(long position); + + /** @return current audio position in milliseconds */ + long getPosition(); + +} Property changes on: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReader.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Added: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReaderMock.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReaderMock.java (rev 0) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReaderMock.java 2012-08-23 10:21:50 UTC (rev 461) @@ -0,0 +1,78 @@ +package fr.ulr.sammoa.application.device.audio; + +import fr.ulr.sammoa.application.device.DeviceState; +import fr.ulr.sammoa.application.device.DeviceStateListener; +import fr.ulr.sammoa.application.device.DeviceTechnicalException; + +import javax.sound.sampled.AudioFileFormat; +import java.io.File; +import java.util.Collections; +import java.util.Set; + +/** + * Created: 21/08/12 + * + * @author fdesbois <florian.desbois@codelutin.com> + */ +public class AudioReaderMock implements AudioReader { + + protected long position; + + @Override + public AudioFileFormat.Type getOutputType() { + return AudioFileFormat.Type.WAVE; + } + + @Override + public void load(File file) { + } + + @Override + public long getLength() { + return 0; + } + + @Override + public void setPosition(long position) { + this.position = position; + } + + @Override + public long getPosition() { + return position; + } + + @Override + public void open() throws DeviceTechnicalException { + } + + @Override + public void start() { + } + + @Override + public void stop() { + } + + @Override + public void close() throws DeviceTechnicalException { + } + + @Override + public DeviceState getState() { + return DeviceState.READY; + } + + @Override + public void addDeviceStateListener(DeviceStateListener listener) { + } + + @Override + public void removeDeviceStateListener(DeviceStateListener listener) { + } + + @Override + public Set<DeviceStateListener> getDeviceStateListeners() { + return Collections.emptySet(); + } +} Property changes on: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReaderMock.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java 2012-08-23 08:04:47 UTC (rev 460) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java 2012-08-23 10:21:50 UTC (rev 461) @@ -52,7 +52,7 @@ * @see GpsHandlerGpsylon * @since 0.2 */ -public abstract class BaseGpsHandler implements GpsHandler { +abstract class BaseGpsHandler implements GpsHandler { private static final Logger logger = LoggerFactory.getLogger(BaseGpsHandler.class);
participants (1)
-
fdesbois@users.forge.codelutin.com