From 6f181227549b24970f390a3764e64b13cf6329b1 Mon Sep 17 00:00:00 2001 From: Paulo Morgado Date: Thu, 29 May 2025 11:00:28 +0100 Subject: [PATCH] Enhance audio source interface and project configurations - Added new using directives and an event for handling encoded audio samples in `MediaEndPoints.cs`. - Updated `SIPSorceryMedia.Abstractions.csproj` to set the language version to 12.0. - Modified `SIPSorceryMedia.Abstractions.UnitTest.csproj` to support multi-targeting for `net462` and `net8.0`, with conditional xUnit runner package references based on the target framework. --- src/MediaEndPoints.cs | 18 ++++++++++++++--- src/SIPSorceryMedia.Abstractions.csproj | 1 + ...PSorceryMedia.Abstractions.UnitTest.csproj | 20 ++++++++++++++----- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/MediaEndPoints.cs b/src/MediaEndPoints.cs index ff08780..4f92dcc 100755 --- a/src/MediaEndPoints.cs +++ b/src/MediaEndPoints.cs @@ -1,5 +1,7 @@ using System; +using System.Buffers; using System.Collections.Generic; +using System.ComponentModel; using System.Net; using System.Runtime.InteropServices; using System.Threading.Tasks; @@ -164,7 +166,7 @@ public struct AudioFormat public const int DEFAULT_CHANNEL_COUNT = 1; public static readonly AudioFormat Empty = new AudioFormat() - { _isNonEmpty = false, ClockRate = DEFAULT_CLOCK_RATE, ChannelCount = DEFAULT_CHANNEL_COUNT }; + { _isNonEmpty = false, ClockRate = DEFAULT_CLOCK_RATE, ChannelCount = DEFAULT_CHANNEL_COUNT }; public AudioCodecsEnum Codec { get; set; } @@ -288,7 +290,7 @@ public AudioFormat(int formatID, string formatName, int clockRate, int rtpClockR { throw new ApplicationException($"The format name must be provided for an AudioFormat."); } - else if(clockRate <= 0) + else if (clockRate <= 0) { throw new ApplicationException($"The clock rate for an AudioFormat must be greater than 0."); } @@ -329,7 +331,7 @@ public struct VideoFormat public const int DEFAULT_CLOCK_RATE = 90000; public static readonly VideoFormat Empty = new VideoFormat() - { _isNonEmpty = false, ClockRate = DEFAULT_CLOCK_RATE }; + { _isNonEmpty = false, ClockRate = DEFAULT_CLOCK_RATE }; public VideoCodecsEnum Codec { get; set; } @@ -544,6 +546,14 @@ public interface IAudioEncoder /// A byte array containing the encoded sample. byte[] EncodeAudio(short[] pcm, AudioFormat format); + /// + /// Encodes 16bit signed PCM samples. + /// + /// An array of 16 bit signed audio samples. + /// The audio format to encode the PCM sample to. + /// A of to receieve the encoded sample. + void EncodeAudio(ReadOnlySpan pcm, AudioFormat format, IBufferWriter destination); + /// /// Decodes to 16bit signed PCM samples. /// @@ -649,6 +659,8 @@ public interface IAudioSource { event EncodedSampleDelegate OnAudioSourceEncodedSample; + event Action> OnAudioSourceEncodedSampleEx; + event RawAudioSampleDelegate OnAudioSourceRawSample; event SourceErrorDelegate OnAudioSourceError; diff --git a/src/SIPSorceryMedia.Abstractions.csproj b/src/SIPSorceryMedia.Abstractions.csproj index e35bcf8..d5dba11 100755 --- a/src/SIPSorceryMedia.Abstractions.csproj +++ b/src/SIPSorceryMedia.Abstractions.csproj @@ -3,6 +3,7 @@ SIPSorceryMedia.Abstractions netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net8.0 + 12.0 true true diff --git a/test/SIPSorceryMedia.Abstractions.UnitTest/SIPSorceryMedia.Abstractions.UnitTest.csproj b/test/SIPSorceryMedia.Abstractions.UnitTest/SIPSorceryMedia.Abstractions.UnitTest.csproj index 5e2e96b..2d0277e 100755 --- a/test/SIPSorceryMedia.Abstractions.UnitTest/SIPSorceryMedia.Abstractions.UnitTest.csproj +++ b/test/SIPSorceryMedia.Abstractions.UnitTest/SIPSorceryMedia.Abstractions.UnitTest.csproj @@ -1,7 +1,7 @@  - net8 + net462;net8.0 false true @@ -11,10 +11,6 @@ - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -24,6 +20,20 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + +