webamp/js/mediaMiddleware.js
2017-03-20 17:14:52 +00:00

97 lines
2.3 KiB
JavaScript

import {
IS_PLAYING,
IS_STOPPED,
LOAD_AUDIO_URL,
LOAD_AUDIO_FILE,
PAUSE,
PLAY,
SEEK_TO_PERCENT_COMPLETE,
SET_BAND_VALUE,
SET_BALANCE,
SET_MEDIA,
SET_VOLUME,
START_WORKING,
STOP,
STOP_WORKING,
TOGGLE_REPEAT,
TOGGLE_SHUFFLE,
UPDATE_TIME_ELAPSED
} from './actionTypes';
export default (media) => (
(store) => {
media.addEventListener('timeupdate', () => {
store.dispatch({type: UPDATE_TIME_ELAPSED, elapsed: media.timeElapsed()});
});
media.addEventListener('ended', () => {
store.dispatch({type: IS_STOPPED});
});
media.addEventListener('playing', () => {
store.dispatch({type: IS_PLAYING});
});
media.addEventListener('waiting', () => {
store.dispatch({type: START_WORKING});
});
media.addEventListener('stopWaiting', () => {
store.dispatch({type: STOP_WORKING});
});
media.addEventListener('fileLoaded', () => {
store.dispatch({
type: SET_MEDIA,
kbps: '128',
khz: Math.round(media.sampleRate() / 1000).toString(),
channels: media.channels(),
name: media.name,
length: media.duration()
});
});
return (next) => (action) => {
switch (action.type) {
case PLAY:
media.play();
break;
case PAUSE:
media.pause();
break;
case STOP:
media.stop();
break;
case SET_VOLUME:
media.setVolume(action.volume);
break;
case SET_BALANCE:
media.setBalance(action.balance);
break;
case TOGGLE_REPEAT:
media.toggleRepeat();
break;
case TOGGLE_SHUFFLE:
media.toggleShuffle();
break;
case SEEK_TO_PERCENT_COMPLETE:
media.seekToPercentComplete(action.percent);
break;
case LOAD_AUDIO_URL:
media.loadFromUrl(action.url, action.name);
break;
case LOAD_AUDIO_FILE:
media.loadFromFileReference(action.file.fileReference);
break;
case SET_BAND_VALUE:
if (action.band === 'preamp') {
media.setPreamp(action.value);
} else {
media.setEqBand(action.band, action.value);
}
break;
}
return next(action);
};
}
);