added settings for min/max buffer

This commit is contained in:
austinried
2021-08-20 16:32:24 +09:00
parent 694d730ebd
commit c83fb43140
6 changed files with 202 additions and 23 deletions

View File

@@ -18,6 +18,8 @@ export type SettingsSlice = {
setEstimateContentLength: (estimateContentLength: boolean) => void
setMaxBitrateWifi: (maxBitrateWifi: number) => void
setMaxBitrateMobile: (maxBitrateMobile: number) => void
setMinBuffer: (minBuffer: number) => void
setMaxBuffer: (maxBuffer: number) => void
pingServer: (server?: Server) => Promise<boolean>
}
@@ -46,6 +48,11 @@ export const selectSettings = {
maxBitrateMobile: (state: SettingsSlice) => state.settings.maxBitrateMobile,
setMaxBitrateMobile: (state: SettingsSlice) => state.setMaxBitrateMobile,
minBuffer: (state: SettingsSlice) => state.settings.minBuffer,
setMinBuffer: (state: SettingsSlice) => state.setMinBuffer,
maxBuffer: (state: SettingsSlice) => state.settings.maxBuffer,
setMaxBuffer: (state: SettingsSlice) => state.setMaxBuffer,
pingServer: (state: SettingsSlice) => state.pingServer,
}
@@ -59,6 +66,8 @@ export const createSettingsSlice = (set: SetState<Store>, get: GetState<Store>):
estimateContentLength: true,
maxBitrateWifi: 0,
maxBitrateMobile: 192,
minBuffer: 3,
maxBuffer: 60,
},
setActiveServer: async (id, force) => {
@@ -122,6 +131,7 @@ export const createSettingsSlice = (set: SetState<Store>, get: GetState<Store>):
)
}),
)
if (get().settings.activeServer === server.id) {
get().setActiveServer(server.id)
}
@@ -141,6 +151,7 @@ export const createSettingsSlice = (set: SetState<Store>, get: GetState<Store>):
state.settings.estimateContentLength = estimateContentLength
}),
)
get().rebuildQueue()
},
@@ -150,6 +161,7 @@ export const createSettingsSlice = (set: SetState<Store>, get: GetState<Store>):
state.settings.maxBitrateWifi = maxBitrateWifi
}),
)
if (get().netState === 'wifi') {
get().rebuildQueue()
}
@@ -161,11 +173,40 @@ export const createSettingsSlice = (set: SetState<Store>, get: GetState<Store>):
state.settings.maxBitrateMobile = maxBitrateMobile
}),
)
if (get().netState === 'mobile') {
get().rebuildQueue()
}
},
setMinBuffer: minBuffer => {
if (minBuffer === get().settings.minBuffer) {
return
}
set(
produce<SettingsSlice>(state => {
state.settings.minBuffer = Math.max(1, Math.min(minBuffer, state.settings.maxBuffer / 2))
}),
)
get().rebuildQueue()
},
setMaxBuffer: maxBuffer => {
if (maxBuffer === get().settings.maxBuffer) {
return
}
set(
produce<SettingsSlice>(state => {
state.settings.maxBuffer = Math.min(5 * 60, Math.max(maxBuffer, state.settings.minBuffer * 2))
}),
)
get().rebuildQueue()
},
pingServer: async server => {
let client: SubsonicApiClient
if (server) {

View File

@@ -2,7 +2,7 @@ import { NoClientError } from '@app/models/error'
import { Song } from '@app/models/music'
import PromiseQueue from '@app/util/PromiseQueue'
import produce from 'immer'
import TrackPlayer, { RepeatMode, State, Track } from 'react-native-track-player'
import TrackPlayer, { PlayerOptions, RepeatMode, State, Track } from 'react-native-track-player'
import { GetState, SetState } from 'zustand'
import { Store } from './store'
@@ -67,6 +67,8 @@ export type TrackPlayerSlice = {
rebuildQueue: () => Promise<void>
buildStreamUri: (id: string) => string
resetTrackPlayerState: () => void
getPlayerOptions: () => PlayerOptions
}
export const selectTrackPlayer = {
@@ -200,7 +202,7 @@ export const createTrackPlayerSlice = (set: SetState<Store>, get: GetState<Store
return trackPlayerCommands.enqueue(async () => {
const shuffled = shuffle !== undefined ? shuffle : !!get().shuffleOrder
await TrackPlayer.setupPlayer()
await TrackPlayer.setupPlayer(get().getPlayerOptions())
await TrackPlayer.reset()
if (songs.length === 0) {
@@ -298,6 +300,7 @@ export const createTrackPlayerSlice = (set: SetState<Store>, get: GetState<Store
const queueContextType = get().queueContextType
await TrackPlayer.reset()
await TrackPlayer.setupPlayer(get().getPlayerOptions())
try {
for (const track of queue) {
@@ -356,6 +359,14 @@ export const createTrackPlayerSlice = (set: SetState<Store>, get: GetState<Store
progress: { position: 0, duration: 0, buffered: 0 },
})
},
getPlayerOptions: () => {
return {
minBuffer: get().settings.minBuffer,
playBuffer: get().settings.minBuffer / 2,
maxBuffer: get().settings.maxBuffer,
}
},
})
export const getQueue = async (): Promise<TrackExt[]> => {