client volumes
This commit is contained in:
1
client/app/components.d.ts
vendored
1
client/app/components.d.ts
vendored
@@ -17,6 +17,7 @@ declare module 'vue' {
|
|||||||
PrimeFloatLabel: typeof import('primevue/floatlabel')['default']
|
PrimeFloatLabel: typeof import('primevue/floatlabel')['default']
|
||||||
PrimeInputText: typeof import('primevue/inputtext')['default']
|
PrimeInputText: typeof import('primevue/inputtext')['default']
|
||||||
PrimePassword: typeof import('primevue/password')['default']
|
PrimePassword: typeof import('primevue/password')['default']
|
||||||
|
PrimeProgressBar: typeof import('primevue/progressbar')['default']
|
||||||
PrimeScrollPanel: typeof import('primevue/scrollpanel')['default']
|
PrimeScrollPanel: typeof import('primevue/scrollpanel')['default']
|
||||||
PrimeSelect: typeof import('primevue/select')['default']
|
PrimeSelect: typeof import('primevue/select')['default']
|
||||||
PrimeSelectButton: typeof import('primevue/selectbutton')['default']
|
PrimeSelectButton: typeof import('primevue/selectbutton')['default']
|
||||||
|
|||||||
@@ -7,7 +7,12 @@
|
|||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<div class="p-3 flex items-center gap-3" @click="toggleExpand">
|
<div class="p-3 flex items-center gap-3" @click="toggleExpand">
|
||||||
<PrimeAvatar size="small">
|
<PrimeAvatar
|
||||||
|
size="small"
|
||||||
|
:class="{
|
||||||
|
'outline-1 outline-primary outline-offset-2': speaking,
|
||||||
|
}"
|
||||||
|
>
|
||||||
<template #icon>
|
<template #icon>
|
||||||
<User :size="20" />
|
<User :size="20" />
|
||||||
</template>
|
</template>
|
||||||
@@ -61,7 +66,7 @@ const props = defineProps<{
|
|||||||
}>()
|
}>()
|
||||||
|
|
||||||
const { outputMuted } = useApp()
|
const { outputMuted } = useApp()
|
||||||
const { consumers: allConsumers, micProducer } = useMediasoup()
|
const { consumers: allConsumers, micProducer, speakingClients } = useMediasoup()
|
||||||
const { me } = useClients()
|
const { me } = useClients()
|
||||||
const { show } = useFullscreenVideo()
|
const { show } = useFullscreenVideo()
|
||||||
|
|
||||||
@@ -94,6 +99,10 @@ const audioTrack = computed(() => {
|
|||||||
return audioConsumer.value?.track
|
return audioConsumer.value?.track
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const speaking = computed(() => {
|
||||||
|
return speakingClients.value.find(speaker => speaker.clientId === props.client.socketId)
|
||||||
|
})
|
||||||
|
|
||||||
const audioConsumerPaused = ref(false)
|
const audioConsumerPaused = ref(false)
|
||||||
|
|
||||||
const inputMuted = computed(() => {
|
const inputMuted = computed(() => {
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
|
import type { SpeakingClient } from '#shared/types'
|
||||||
import type { MediaKind, ProducerOptions } from 'mediasoup-client/types'
|
import type { MediaKind, ProducerOptions } from 'mediasoup-client/types'
|
||||||
import { createSharedComposable } from '@vueuse/core'
|
import { createSharedComposable } from '@vueuse/core'
|
||||||
import * as mediasoupClient from 'mediasoup-client'
|
import * as mediasoupClient from 'mediasoup-client'
|
||||||
|
import { shallowRef } from 'vue'
|
||||||
import { useDevices } from '~/composables/use-devices'
|
import { useDevices } from '~/composables/use-devices'
|
||||||
import { usePreferences } from '~/composables/use-preferences'
|
import { usePreferences } from '~/composables/use-preferences'
|
||||||
import { useSignaling } from '~/composables/use-signaling'
|
import { useSignaling } from '~/composables/use-signaling'
|
||||||
@@ -40,6 +42,8 @@ export const useMediasoup = createSharedComposable(() => {
|
|||||||
const consumers = shallowRef<Map<string, mediasoupClient.types.Consumer>>(new Map())
|
const consumers = shallowRef<Map<string, mediasoupClient.types.Consumer>>(new Map())
|
||||||
const producers = shallowRef<Map<string, mediasoupClient.types.Producer>>(new Map())
|
const producers = shallowRef<Map<string, mediasoupClient.types.Producer>>(new Map())
|
||||||
|
|
||||||
|
const speakingClients = shallowRef<SpeakingClient[]>([])
|
||||||
|
|
||||||
watch(signaling.socket, (socket) => {
|
watch(signaling.socket, (socket) => {
|
||||||
if (!socket)
|
if (!socket)
|
||||||
return
|
return
|
||||||
@@ -227,6 +231,10 @@ export const useMediasoup = createSharedComposable(() => {
|
|||||||
|
|
||||||
triggerRef(consumers)
|
triggerRef(consumers)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
socket.on('speakingPeers', (value: SpeakingClient[]) => {
|
||||||
|
speakingClients.value = value
|
||||||
|
})
|
||||||
}, { immediate: true, flush: 'sync' })
|
}, { immediate: true, flush: 'sync' })
|
||||||
|
|
||||||
async function enableProducer(type: ProducerType, options: ProducerOptions) {
|
async function enableProducer(type: ProducerType, options: ProducerOptions) {
|
||||||
@@ -424,6 +432,7 @@ export const useMediasoup = createSharedComposable(() => {
|
|||||||
init,
|
init,
|
||||||
consumers,
|
consumers,
|
||||||
producers,
|
producers,
|
||||||
|
speakingClients,
|
||||||
sendTransport,
|
sendTransport,
|
||||||
recvTransport,
|
recvTransport,
|
||||||
rtpCapabilities,
|
rtpCapabilities,
|
||||||
|
|||||||
@@ -8,3 +8,8 @@ export interface ChadClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export type UpdatedClient = Omit<ChadClient, 'socketId' | 'userId' | 'isMe'>
|
export type UpdatedClient = Omit<ChadClient, 'socketId' | 'userId' | 'isMe'>
|
||||||
|
|
||||||
|
export interface SpeakingClient {
|
||||||
|
clientId: ChadClient['socketId']
|
||||||
|
volume: number
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"$schema": "../node_modules/@tauri-apps/cli/config.schema.json",
|
"$schema": "../node_modules/@tauri-apps/cli/config.schema.json",
|
||||||
"productName": "chad",
|
"productName": "chad",
|
||||||
"version": "0.2.19",
|
"version": "0.2.20",
|
||||||
"identifier": "xyz.koptilnya.chad",
|
"identifier": "xyz.koptilnya.chad",
|
||||||
"build": {
|
"build": {
|
||||||
"frontendDist": "../.output/public",
|
"frontendDist": "../.output/public",
|
||||||
|
|||||||
Reference in New Issue
Block a user