Skip to content

Commit ed4975f

Browse files
author
Harley Torrisi
committed
Migrate audio setting requests to new structure
1 parent 21db660 commit ed4975f

35 files changed

Lines changed: 297 additions & 264 deletions

http/sonar.http

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ PUT {{SONAR_ADDRESS}}/volumeSettings/classic/Master/mute/false
3232
### -> SET -> Volume Level - Streamer - Monitoring - Master - 50%
3333
PUT {{SONAR_ADDRESS}}/volumeSettings/streamer/monitoring/master/volume/0.5
3434

35-
### -> SET -> Volume Level - Streamer - Monitoring - Master - 50%
35+
### -> SET -> Volume Level - Streamer - Streaming - Master - 50%
3636
PUT {{SONAR_ADDRESS}}/volumeSettings/streamer/streaming/master/volume/0.5
3737

3838

src/enums.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,3 @@
1-
export enum SonarChannel {
2-
Master = 'master',
3-
Game = 'game',
4-
Chat = 'chatRender',
5-
Media = 'media',
6-
Aux = 'aux',
7-
Mic = 'chatCapture'
8-
}
9-
101
/**
112
* Sonar audio mixing channels.
123
* @property {@link AudioChannel.Master} - Master volume channel.

src/exceptions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ abstract class Exception extends Error {
1010
}
1111
}
1212

13-
export class SonarException extends Exception {
13+
abstract class SonarException extends Exception {
1414
constructor(message = 'There was an issue interacting with the Sonar service.', cause?: Error) {
1515
super(message, cause)
1616
}
Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,31 @@
11
import { AudioChannel } from '@/enums'
2-
import { SonarException } from '@/exceptions'
32
import { convertVolumeToUser } from '@/functions/converters/convert-volume-to-user'
4-
import type { ApiChannelDataClassic, ApiVolumeDataClassic } from '@/models/api-volume-data-classic.ok'
5-
import type { AudioDataClassic, ChannelAudioDataClassic } from '@/types/audio-data-classic'
6-
7-
const DEFAULT_ERROR_TEXT = 'Failed to get audio data.'
3+
import type { VolumeInfoClassic } from '@/sonar/models/audio-settings/volume-info-classic'
4+
import { requestVolumeSettingsClassic } from '@/sonar/requests/volume-settings/request-volume-settings-classic'
5+
import type { ChannelVolumeClassic } from '@/types/channel-volume-classic'
6+
import type { ChannelVolumesClassic } from '@/types/channel-volumes-classic'
87

98
/**
109
* Gets audio data for all channels.
1110
* @param sonarEndpoint Sonar endpoint URL
1211
* @returns volume in the range of 0 to 100,
1312
*/
14-
export async function getAudioDataClassic(sonarEndpoint: string): Promise<AudioDataClassic> {
15-
let response: Response
16-
17-
try {
18-
response = await fetch(`${sonarEndpoint}/volumeSettings/classic`)
19-
} catch (error) {
20-
throw new SonarException(DEFAULT_ERROR_TEXT, error as Error)
21-
}
22-
23-
if (response.ok) {
24-
const data = (await response.json()) as ApiVolumeDataClassic
25-
if (data?.masters?.classic == null) {
26-
throw new SonarException(`${DEFAULT_ERROR_TEXT} Missing required data in response.`)
27-
}
28-
const volumeData: AudioDataClassic = {
29-
[AudioChannel.Master]: createResponseVolumeData(data.masters.classic),
30-
[AudioChannel.Game]: data.devices.game && createResponseVolumeData(data.devices.game),
31-
[AudioChannel.Chat]: data.devices.chatRender && createResponseVolumeData(data.devices.chatRender),
32-
[AudioChannel.Media]: data.devices.media && createResponseVolumeData(data.devices.media),
33-
[AudioChannel.Aux]: data.devices.aux && createResponseVolumeData(data.devices.aux),
34-
[AudioChannel.Mic]: data.devices.chatCapture && createResponseVolumeData(data.devices.chatCapture)
35-
}
36-
return volumeData
37-
} else {
38-
const data = await response.text()
39-
throw new SonarException(DEFAULT_ERROR_TEXT, new Error(data))
13+
export async function getAudioDataClassic(sonarEndpoint: string): Promise<ChannelVolumesClassic> {
14+
const data = await requestVolumeSettingsClassic(sonarEndpoint)
15+
const volumeData: ChannelVolumesClassic = {
16+
[AudioChannel.Master]: createResponseVolumeData(data.masters.classic),
17+
[AudioChannel.Game]: data.devices.game && createResponseVolumeData(data.devices.game.classic),
18+
[AudioChannel.Chat]: data.devices.chatRender && createResponseVolumeData(data.devices.chatRender.classic),
19+
[AudioChannel.Media]: data.devices.media && createResponseVolumeData(data.devices.media.classic),
20+
[AudioChannel.Aux]: data.devices.aux && createResponseVolumeData(data.devices.aux.classic),
21+
[AudioChannel.Mic]: data.devices.chatCapture && createResponseVolumeData(data.devices.chatCapture.classic)
4022
}
23+
return volumeData
4124
}
4225

43-
function createResponseVolumeData(volumeData: ApiChannelDataClassic): ChannelAudioDataClassic {
26+
function createResponseVolumeData(volumeData: VolumeInfoClassic): ChannelVolumeClassic {
4427
return {
4528
volume: convertVolumeToUser(volumeData.volume),
46-
isMuted: volumeData.isMuted
29+
isMuted: volumeData.muted
4730
}
4831
}
Lines changed: 24 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,37 @@
1-
import { AudioChannel } from '@/enums'
2-
import { SonarException } from '@/exceptions'
1+
import { AudioChannel, StreamerPath } from '@/enums'
32
import { convertVolumeToUser } from '@/functions/converters/convert-volume-to-user'
4-
import type { ApiChannelDataStreamer, ApiVolumeDataStreamer } from '@/models/api-volume-data-streamer.ok'
5-
import type { AudioDataStreamer, ChannelAudioDataStreamer } from '@/types/audio-data-streamer'
6-
7-
const DEFAULT_ERROR_TEXT = 'Failed to get audio data.'
3+
import type { VolumeInfoStreamer } from '@/sonar/models/audio-settings/volume-info-streamer'
4+
import { requestVolumeSettingsStreamer } from '@/sonar/requests/volume-settings/request-volume-settings-streamer'
5+
import type { ChannelVolumeStreamer } from '@/types/channel-volume-streamer'
6+
import type { ChannelVolumesStreamer } from '@/types/channel-volumes-streamer'
87

98
/**
109
* Gets audio data for all channels.
1110
* @param sonarEndpoint Sonar endpoint URL
1211
* @returns volume in the range of 0 to 100,
1312
*/
14-
export async function getAudioDataStream(sonarEndpoint: string): Promise<AudioDataStreamer> {
15-
let response: Response
16-
17-
try {
18-
response = await fetch(`${sonarEndpoint}/volumeSettings/streamer`)
19-
} catch (error) {
20-
throw new SonarException(DEFAULT_ERROR_TEXT, error as Error)
21-
}
22-
23-
if (response.ok) {
24-
const data = (await response.json()) as ApiVolumeDataStreamer
25-
if (data?.masters?.stream == null) {
26-
throw new SonarException(`${DEFAULT_ERROR_TEXT} Missing required data in response.`)
27-
}
28-
const volumeData: AudioDataStreamer = {
29-
[AudioChannel.Master]: createResponseVolumeData(data.masters),
30-
[AudioChannel.Game]: data.devices.game && createResponseVolumeData(data.devices.game),
31-
[AudioChannel.Chat]: data.devices.chatRender && createResponseVolumeData(data.devices.chatRender),
32-
[AudioChannel.Media]: data.devices.media && createResponseVolumeData(data.devices.media),
33-
[AudioChannel.Aux]: data.devices.aux && createResponseVolumeData(data.devices.aux),
34-
[AudioChannel.Mic]: data.devices.chatCapture && createResponseVolumeData(data.devices.chatCapture)
35-
}
36-
return volumeData
37-
} else {
38-
const data = await response.text()
39-
throw new SonarException(DEFAULT_ERROR_TEXT, new Error(data))
13+
export async function getAudioDataStream(sonarEndpoint: string): Promise<ChannelVolumesStreamer> {
14+
const data = await requestVolumeSettingsStreamer(sonarEndpoint)
15+
const volumeData: ChannelVolumesStreamer = {
16+
[AudioChannel.Master]: createResponseVolumeData(data.masters.stream),
17+
[AudioChannel.Game]: data.devices.game && createResponseVolumeData(data.devices.game.stream),
18+
[AudioChannel.Chat]: data.devices.chatRender && createResponseVolumeData(data.devices.chatRender.stream),
19+
[AudioChannel.Media]: data.devices.media && createResponseVolumeData(data.devices.media.stream),
20+
[AudioChannel.Aux]: data.devices.aux && createResponseVolumeData(data.devices.aux.stream),
21+
[AudioChannel.Mic]: data.devices.chatCapture && createResponseVolumeData(data.devices.chatCapture.stream)
4022
}
23+
return volumeData
4124
}
4225

43-
function createResponseVolumeData(volumeData: ApiChannelDataStreamer): ChannelAudioDataStreamer {
26+
function createResponseVolumeData(volumeData: VolumeInfoStreamer): ChannelVolumeStreamer {
4427
return {
45-
volumeStreamer: convertVolumeToUser(volumeData.stream.streaming.volume),
46-
volumeMonitoring: convertVolumeToUser(volumeData.stream.monitoring.volume),
47-
isMutedStreamer: volumeData.stream.streaming.isMuted,
48-
isMutedMonitoring: volumeData.stream.monitoring.isMuted
28+
[StreamerPath.Streaming]: {
29+
volume: convertVolumeToUser(volumeData.streaming.volume),
30+
isMuted: volumeData.streaming.muted
31+
},
32+
[StreamerPath.Monitoring]: {
33+
volume: convertVolumeToUser(volumeData.monitoring.volume),
34+
isMuted: volumeData.monitoring.muted
35+
}
4936
}
5037
}
Lines changed: 18 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
1-
import { FETCH_OPTIONS_PUT } from '@/consts/fetch-options-put'
2-
import { type AudioChannel, SonarChannel } from '@/enums'
3-
import { SonarException } from '@/exceptions'
1+
import type { AudioChannel } from '@/enums'
2+
import { SonarServerException } from '@/exceptions'
43
import { convertChannelToApi } from '@/functions/converters/convert-channel-to-api'
54
import { convertVolumeToApi } from '@/functions/converters/convert-volume-to-api'
65
import { convertVolumeToUser } from '@/functions/converters/convert-volume-to-user'
7-
import type { ApiError } from '@/models/api-error'
8-
import type { ApiVolumeDataClassic } from '@/models/api-volume-data-classic.ok'
9-
import type { ChannelAudioDataClassic } from '@/types/audio-data-classic'
10-
11-
const DEFAULT_ERROR_TEXT = 'Failed to set audio volume.'
6+
import { SonarChannel } from '@/sonar/models/audio-settings/enums/sonar-channel'
7+
import { changeVolumeSettingsClassic } from '@/sonar/requests/volume-settings/change-volume-settings-classic'
8+
import type { ChannelVolumeClassic } from '@/types/channel-volume-classic'
129

1310
/**
1411
* Sets audio data for target channel.
@@ -20,41 +17,21 @@ export async function setChannelVolumeClassic(
2017
sonarEndpoint: string,
2118
volumePercent: number,
2219
channel: AudioChannel
23-
): Promise<ChannelAudioDataClassic> {
24-
let response: Response
25-
let sonarChannel: SonarChannel
26-
27-
try {
28-
sonarChannel = convertChannelToApi(channel)
29-
const formattedVolume = convertVolumeToApi(volumePercent)
30-
response = await fetch(
31-
`${sonarEndpoint}/volumeSettings/classic/${sonarChannel}/volume/${formattedVolume}`,
32-
FETCH_OPTIONS_PUT
33-
)
34-
} catch (error) {
35-
throw new SonarException(DEFAULT_ERROR_TEXT, error as Error)
36-
}
37-
38-
if (response.ok) {
39-
const data = (await response.json()) as ApiVolumeDataClassic
40-
if (data?.masters?.classic == null) {
41-
throw new SonarException(`${DEFAULT_ERROR_TEXT} Missing required data in response.`)
42-
}
20+
): Promise<ChannelVolumeClassic> {
21+
const sonarChannel = convertChannelToApi(channel)
22+
const formattedVolume = convertVolumeToApi(volumePercent)
23+
const data = await changeVolumeSettingsClassic(sonarEndpoint, formattedVolume, sonarChannel)
4324

44-
const device = sonarChannel === SonarChannel.Master ? data.masters.classic : data.devices[sonarChannel]
25+
const device = sonarChannel === SonarChannel.Master ? data.masters.classic : data.devices[sonarChannel]?.classic
4526

46-
if (!device) {
47-
throw new SonarException(`${DEFAULT_ERROR_TEXT} Missing device data in response.`)
48-
}
49-
50-
const result: ChannelAudioDataClassic = {
51-
volume: convertVolumeToUser(device.volume),
52-
isMuted: device.isMuted
53-
}
27+
if (!device) {
28+
throw new SonarServerException({ message: `Missing device data in response.` })
29+
}
5430

55-
return result
56-
} else {
57-
const data = (await response.json()) as ApiError
58-
throw new SonarException(data?.error ?? DEFAULT_ERROR_TEXT)
31+
const result: ChannelVolumeClassic = {
32+
volume: convertVolumeToUser(device.volume),
33+
isMuted: device.muted
5934
}
35+
36+
return result
6037
}
Lines changed: 21 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
import { FETCH_OPTIONS_PUT } from '@/consts/fetch-options-put'
2-
import { type AudioChannel, SonarChannel, StreamerPath } from '@/enums'
3-
import { SonarException } from '@/exceptions'
1+
import { type AudioChannel, StreamerPath } from '@/enums'
2+
import { SonarServerException } from '@/exceptions'
43
import { convertChannelToApi } from '@/functions/converters/convert-channel-to-api'
54
import { convertVolumeToApi } from '@/functions/converters/convert-volume-to-api'
65
import { convertVolumeToUser } from '@/functions/converters/convert-volume-to-user'
7-
import type { ApiVolumeDataStreamer } from '@/models/api-volume-data-streamer.ok'
8-
import type { StreamVolume } from '@/types/audio-data-streamer'
9-
10-
const DEFAULT_ERROR_TEXT = 'Failed to set audio volume.'
6+
import { SonarChannel } from '@/sonar/models/audio-settings/enums/sonar-channel'
7+
import { StreamingPath } from '@/sonar/models/audio-settings/enums/streaming-path'
8+
import { changeVolumeSettingsStreamer } from '@/sonar/requests/volume-settings/change-volume-settings-streamer'
9+
import type { ChannelVolumeStreamerPath } from '@/types/channel-volume-streamer-path'
1110

1211
/**
1312
* Sets audio data for target channel.
@@ -21,43 +20,24 @@ export async function setChannelVolumeStreamer(
2120
volumePercent: number,
2221
channel: AudioChannel,
2322
path: StreamerPath
24-
): Promise<StreamVolume> {
25-
let response: Response
26-
let sonarChannel: SonarChannel
27-
28-
try {
29-
sonarChannel = convertChannelToApi(channel)
30-
const formattedVolume = convertVolumeToApi(volumePercent)
31-
response = await fetch(
32-
`${sonarEndpoint}/volumeSettings/streamer/${path}/${sonarChannel}/volume/${formattedVolume}`,
33-
FETCH_OPTIONS_PUT
34-
)
35-
} catch (error) {
36-
throw new SonarException(DEFAULT_ERROR_TEXT, error as Error)
37-
}
38-
39-
if (response.ok) {
40-
const data = (await response.json()) as ApiVolumeDataStreamer
41-
if (data?.masters?.stream == null) {
42-
throw new SonarException(`${DEFAULT_ERROR_TEXT} Missing required data in response.`)
43-
}
23+
): Promise<ChannelVolumeStreamerPath> {
24+
const sonarChannel = convertChannelToApi(channel)
25+
const formattedVolume = convertVolumeToApi(volumePercent)
26+
const streamPath = path === StreamerPath.Streaming ? StreamingPath.Streaming : StreamingPath.Monitoring
27+
const data = await changeVolumeSettingsStreamer(sonarEndpoint, formattedVolume, sonarChannel, streamPath)
4428

45-
const device = sonarChannel === SonarChannel.Master ? data.masters.stream : data.devices[sonarChannel]?.stream
29+
const device = sonarChannel === SonarChannel.Master ? data.masters.stream : data.devices[sonarChannel]?.stream
4630

47-
if (!device) {
48-
throw new SonarException(`${DEFAULT_ERROR_TEXT} Missing device data in response.`)
49-
}
50-
51-
const devicePath = path === StreamerPath.Streaming ? device.streaming : device.monitoring
31+
if (!device) {
32+
throw new SonarServerException({ message: `Missing device data in response.` })
33+
}
5234

53-
const result: StreamVolume = {
54-
volume: convertVolumeToUser(devicePath.volume),
55-
isMuted: devicePath.isMuted
56-
}
35+
const devicePath = path === StreamerPath.Streaming ? device.streaming : device.monitoring
5736

58-
return result
59-
} else {
60-
const data = await response.text()
61-
throw new SonarException(DEFAULT_ERROR_TEXT, new Error(data))
37+
const result: ChannelVolumeStreamerPath = {
38+
volume: convertVolumeToUser(devicePath.volume),
39+
isMuted: devicePath.muted
6240
}
41+
42+
return result
6343
}

src/functions/converters/convert-channel-to-api.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
1-
import { AudioChannel, SonarChannel } from '@/enums'
1+
import { AudioChannel } from '@/enums'
2+
import { SonarChannel } from '@/sonar/models/audio-settings/enums/sonar-channel'
23

34
export function convertChannelToApi(channel: AudioChannel): SonarChannel {
45
switch (channel) {
56
case AudioChannel.Master:
67
return SonarChannel.Master
78
case AudioChannel.Game:
8-
return SonarChannel.Chat
9+
return SonarChannel.ChatRender
910
case AudioChannel.Media:
1011
return SonarChannel.Media
1112
case AudioChannel.Aux:
1213
return SonarChannel.Aux
1314
case AudioChannel.Mic:
14-
return SonarChannel.Mic
15+
return SonarChannel.ChatCapture
1516
default:
1617
throw new Error(`Unsupported AudioChannel: ${channel}`)
1718
}

src/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,3 @@ export * from '@/functions/audio/set-audio-mode'
77
export * from '@/functions/endpoint/get-app-endpoint'
88
export * from '@/functions/endpoint/get-sonar-endpoint'
99
export * from '@/functions/endpoint/get-sonar-endpoint-cached'
10-
export * from '@/types/audio-data-classic'
11-
export * from '@/types/audio-data-streamer'

src/models/api-error.ts

Lines changed: 0 additions & 3 deletions
This file was deleted.

0 commit comments

Comments
 (0)