2022-06-29 14:45:17 +03:00

137 lines
6.1 KiB
C#

// -----------------------------------------------------------------------
// <copyright file="VoiceInfo.cs" company="Exit Games GmbH">
// Photon Voice API Framework for Photon - Copyright (C) 2017 Exit Games GmbH
// </copyright>
// <summary>
// Photon data streaming support.
// </summary>
// <author>developer@photonengine.com</author>
// ----------------------------------------------------------------------------
using System.Collections.Generic;
namespace Photon.Voice
{
/// <summary>Describes stream properties.</summary>
public struct VoiceInfo
{
/// <summary>
/// Create stream info for an Opus audio stream.
/// </summary>
/// <param name="samplingRate">Audio sampling rate.</param>
/// <param name="channels">Number of channels.</param>
/// <param name="frameDurationUs">Uncompressed frame (audio packet) size in microseconds.</param>
/// <param name="bitrate">Stream bitrate (in bits/second).</param>
/// <param name="userdata">Optional user data. Should be serializable by Photon.</param>
/// <returns>VoiceInfo instance.</returns>
static public VoiceInfo CreateAudioOpus(POpusCodec.Enums.SamplingRate samplingRate, int channels, OpusCodec.FrameDuration frameDurationUs, int bitrate, object userdata = null)
{
return new VoiceInfo()
{
Codec = Codec.AudioOpus,
SamplingRate = (int)samplingRate,
Channels = channels,
FrameDurationUs = (int)frameDurationUs,
Bitrate = bitrate,
UserData = userdata
};
}
/// <summary>
/// Create stream info for an audio stream.
/// </summary>
/// <param name="codec">Audio codec.</param>
/// <param name="samplingRate">Audio sampling rate.</param>
/// <param name="channels">Number of channels.</param>
/// <param name="frameDurationUs">Uncompressed frame (audio packet) size in microseconds.</param>
/// <param name="userdata">Optional user data. Should be serializable by Photon.</param>
/// <returns>VoiceInfo instance.</returns>
static public VoiceInfo CreateAudio(Codec codec, int samplingRate, int channels, int frameDurationUs, object userdata = null)
{
return new VoiceInfo()
{
Codec = codec,
SamplingRate = (int)samplingRate,
Channels = channels,
FrameDurationUs = (int)frameDurationUs,
UserData = userdata
};
}
#if PHOTON_VOICE_VIDEO_ENABLE
/// <summary>
/// Create stream info for a video stream.
/// </summary>
/// <param name="codec">Video codec.</param>
/// <param name="bitrate">Stream bitrate.</param>
/// <param name="width">Streamed video width. If 0, width and height of video source used (no rescaling).</param>
/// <param name="heigth">Streamed video height. If -1, aspect ratio preserved during rescaling.</param>
/// <param name="fps">Streamed video frames per second.</param>
/// <param name="keyFrameInt">Keyframes interval in frames.</param>///
/// <param name="userdata">Optional user data. Should be serializable by Photon.</param>
/// <returns>VoiceInfo instance.</returns>
static public VoiceInfo CreateVideo(Codec codec, int bitrate, int width, int heigth, int fps, int keyFrameInt, object userdata = null)
{
return new VoiceInfo()
{
Codec = codec,
Bitrate = bitrate,
Width = width,
Height = heigth,
FPS = fps,
KeyFrameInt = keyFrameInt,
UserData = userdata,
};
}
#endif
public override string ToString()
{
return "c=" + Codec + " f=" + SamplingRate + " ch=" + Channels + " d=" + FrameDurationUs + " s=" + FrameSize + " b=" + Bitrate + " w=" + Width + " h=" + Height + " fps=" + FPS + " kfi=" + KeyFrameInt + " ud=" + UserData;
}
public Codec Codec { get; set; }
/// <summary>Audio sampling rate (frequency, in Hz).</summary>
public int SamplingRate { get; set; }
/// <summary>Number of channels.</summary>
public int Channels { get; set; }
/// <summary>Uncompressed frame (audio packet) size in microseconds.</summary>
public int FrameDurationUs { get; set; }
/// <summary>Target bitrate (in bits/second).</summary>
public int Bitrate { get; set; }
/// <summary>Video width.</summary>
public int Width { get; set; }
/// <summary>Video height</summary>
public int Height { get; set; }
/// <summary>Video frames per second</summary>
public int FPS { get; set; }
/// <summary>Video keyframe interval in frames</summary>
public int KeyFrameInt { get; set; }
/// <summary>Optional user data. Should be serializable by Photon.</summary>
public object UserData { get; set; }
/// <summary>Uncompressed frame (data packet) size in samples.</summary>
public int FrameDurationSamples { get { return (int)(this.SamplingRate * (long)this.FrameDurationUs / 1000000); } }
/// <summary>Uncompressed frame (data packet) array size.</summary>
public int FrameSize { get { return this.FrameDurationSamples * this.Channels; } }
}
/// <summary>Information about a remote voice (incoming stream).</summary>
public class RemoteVoiceInfo
{
internal RemoteVoiceInfo(int channelId, int playerId, byte voiceId, VoiceInfo info)
{
this.ChannelId = channelId;
this.PlayerId = playerId;
this.VoiceId = voiceId;
this.Info = info;
}
/// <summary>Remote voice info.</summary>
public VoiceInfo Info { get; private set; }
/// <summary>ID of channel used for transmission.</summary>
public int ChannelId { get; private set; }
/// <summary>Player ID of voice owner.</summary>
public int PlayerId { get; private set; }
/// <summary>Voice ID (unique in the room).</summary>
public byte VoiceId { get; private set; }
}
}