From 8d622c3ed823414e42d95fe6f606545ad3cc914f Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Mon, 5 May 2025 15:46:37 +0800 Subject: [PATCH 1/7] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=20GetData=20?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/MediaDevices/DefaultAudioDevice.cs | 5 +++++ .../Services/MediaDevices/DefaultMediaDevices.cs | 6 ++++++ src/BootstrapBlazor/Services/MediaDevices/IAudioDevice.cs | 6 ++++++ src/BootstrapBlazor/Services/MediaDevices/IMediaDevices.cs | 6 ++++++ 4 files changed, 23 insertions(+) diff --git a/src/BootstrapBlazor/Services/MediaDevices/DefaultAudioDevice.cs b/src/BootstrapBlazor/Services/MediaDevices/DefaultAudioDevice.cs index 05708cea6cc..95b0420bfe2 100644 --- a/src/BootstrapBlazor/Services/MediaDevices/DefaultAudioDevice.cs +++ b/src/BootstrapBlazor/Services/MediaDevices/DefaultAudioDevice.cs @@ -31,4 +31,9 @@ public Task Close(string? selector) { return deviceService.Close(selector); } + + public Task GetData() + { + return deviceService.GetAudioData(); + } } diff --git a/src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs b/src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs index 2e4914bb1ea..73c01e40408 100644 --- a/src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs +++ b/src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs @@ -62,4 +62,10 @@ public async Task Apply(MediaTrackConstraints constraints) var module = await LoadModule(); return await module.InvokeAsync("apply", constraints); } + + public async Task GetAudioData() + { + var module = await LoadModule(); + return await module.InvokeAsync("getAudioData"); + } } diff --git a/src/BootstrapBlazor/Services/MediaDevices/IAudioDevice.cs b/src/BootstrapBlazor/Services/MediaDevices/IAudioDevice.cs index dc8f9f68731..8f4685a1402 100644 --- a/src/BootstrapBlazor/Services/MediaDevices/IAudioDevice.cs +++ b/src/BootstrapBlazor/Services/MediaDevices/IAudioDevice.cs @@ -29,4 +29,10 @@ public interface IAudioDevice /// /// Task Close(string? selector); + + /// + /// Gets the stream of the audio. + /// + /// + Task GetData(); } diff --git a/src/BootstrapBlazor/Services/MediaDevices/IMediaDevices.cs b/src/BootstrapBlazor/Services/MediaDevices/IMediaDevices.cs index 67466fabca4..99da23a9a25 100644 --- a/src/BootstrapBlazor/Services/MediaDevices/IMediaDevices.cs +++ b/src/BootstrapBlazor/Services/MediaDevices/IMediaDevices.cs @@ -55,4 +55,10 @@ public interface IMediaDevices /// /// Task Apply(MediaTrackConstraints constraints); + + /// + /// Gets the stream of the audio. + /// + /// + Task GetAudioData(); } From 87d7ef799ef1a7d2e4ee77c50901385377e5480e Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Mon, 5 May 2025 15:53:57 +0800 Subject: [PATCH 2/7] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=8A=A0=20getAudioDa?= =?UTF-8?q?ta=20=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/wwwroot/modules/media.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/BootstrapBlazor/wwwroot/modules/media.js b/src/BootstrapBlazor/wwwroot/modules/media.js index cef7f694731..ef4e514a551 100644 --- a/src/BootstrapBlazor/wwwroot/modules/media.js +++ b/src/BootstrapBlazor/wwwroot/modules/media.js @@ -202,6 +202,7 @@ export async function record(options) { audio.classList.remove("d-none"); audio.classList.remove("hidden"); audio.removeAttribute("hidden"); + media.audioBlob = blob; } } delete media.audioSelector; @@ -233,3 +234,8 @@ export function stop(selector) { } return ret; } + +export function getAudioData() { + const media = registerBootstrapBlazorModule("MediaDevices"); + return media.audioBlob +} From ca20844c4a7f794ae95f6bff4f3ca5975d9b8a4a Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Mon, 5 May 2025 15:54:20 +0800 Subject: [PATCH 3/7] =?UTF-8?q?doc:=20=E5=A2=9E=E5=8A=A0=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Samples/AudioDevices.razor | 5 ++++- .../Components/Samples/AudioDevices.razor.cs | 12 ++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/BootstrapBlazor.Server/Components/Samples/AudioDevices.razor b/src/BootstrapBlazor.Server/Components/Samples/AudioDevices.razor index 7462a9f529c..1571918797e 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/AudioDevices.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/AudioDevices.razor @@ -24,6 +24,9 @@ private IAudioDevice? AudioDeviceService { get; set; } - +
+ + +
diff --git a/src/BootstrapBlazor.Server/Components/Samples/AudioDevices.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/AudioDevices.razor.cs index 11d84ce3788..43a73bb7df7 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/AudioDevices.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Samples/AudioDevices.razor.cs @@ -13,6 +13,9 @@ public partial class AudioDevices : IAsyncDisposable [Inject, NotNull] private IAudioDevice? AudioDeviceService { get; set; } + [Inject, NotNull] + private DownloadService? DownloadService { get; set; } + private readonly List _devices = []; private List _items = []; @@ -53,6 +56,15 @@ private async Task OnClose() await AudioDeviceService.Close(".bb-audio"); } + private async Task OnDownload() + { + var stream = await AudioDeviceService.GetData(); + if (stream != null) + { + await DownloadService.DownloadFromStreamAsync("data.wav", stream); + } + } + private async Task DisposeAsync(bool disposing) { if (disposing) From cd67673cff90d455e524e65e09b5578ccf53f7eb Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Mon, 5 May 2025 16:03:23 +0800 Subject: [PATCH 4/7] =?UTF-8?q?refactor:=20=E6=9B=B4=E6=96=B0=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/MediaDevices/DefaultMediaDevices.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs b/src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs index 73c01e40408..682c58bc570 100644 --- a/src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs +++ b/src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs @@ -65,7 +65,13 @@ public async Task Apply(MediaTrackConstraints constraints) public async Task GetAudioData() { + Stream? ret = null; var module = await LoadModule(); - return await module.InvokeAsync("getAudioData"); + var stream = await module.InvokeAsync("getAudioData"); + if (stream != null) + { + ret = await stream.OpenReadStreamAsync(stream.Length); + } + return ret; } } From 9db0946241f8d5bcac8126c95340949fc27adcd2 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Mon, 5 May 2025 16:03:29 +0800 Subject: [PATCH 5/7] =?UTF-8?q?test:=20=E6=9B=B4=E6=96=B0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Services/AudioDeviceTest.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/UnitTest/Services/AudioDeviceTest.cs b/test/UnitTest/Services/AudioDeviceTest.cs index e1a5136c397..9d07721b5b2 100644 --- a/test/UnitTest/Services/AudioDeviceTest.cs +++ b/test/UnitTest/Services/AudioDeviceTest.cs @@ -3,6 +3,9 @@ // See the LICENSE file in the project root for more information. // Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone +using Microsoft.JSInterop; +using UnitTest.Mock; + namespace UnitTest.Services; public class AudioDeviceTest : BootstrapBlazorTestBase @@ -28,6 +31,7 @@ public async Task Open_Ok() { Context.JSInterop.Setup("open", _ => true).SetResult(true); Context.JSInterop.Setup("close", _ => true).SetResult(true); + Context.JSInterop.Setup("getAudioData").SetResult(new MockJSStreamReference()); var service = Context.Services.GetRequiredService(); var options = new MediaTrackConstraints() @@ -40,5 +44,9 @@ public async Task Open_Ok() var close = await service.Close(".bb-audio"); Assert.True(close); + + var data = await service.GetData(); + Assert.NotNull(data); + Assert.Equal(4, data.Length); } } From 2b136ef3145a6eab6addb5a069913b7c6f4b3a74 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Mon, 5 May 2025 16:08:05 +0800 Subject: [PATCH 6/7] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Samples/AudioDevices.razor | 6 ++---- src/BootstrapBlazor.Server/Locales/en-US.json | 5 ++++- src/BootstrapBlazor.Server/Locales/zh-CN.json | 3 ++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Samples/AudioDevices.razor b/src/BootstrapBlazor.Server/Components/Samples/AudioDevices.razor index 1571918797e..0922b5d574f 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/AudioDevices.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/AudioDevices.razor @@ -17,6 +17,7 @@ private IAudioDevice? AudioDeviceService { get; set; } +
@@ -24,9 +25,6 @@ private IAudioDevice? AudioDeviceService { get; set; }
-
- - -
+ diff --git a/src/BootstrapBlazor.Server/Locales/en-US.json b/src/BootstrapBlazor.Server/Locales/en-US.json index d9d406a223e..a3aed59c1b9 100644 --- a/src/BootstrapBlazor.Server/Locales/en-US.json +++ b/src/BootstrapBlazor.Server/Locales/en-US.json @@ -7137,6 +7137,9 @@ "BaseUsageIntro": "Perform different operations by calling different API methods", "AudioDeviceRequestText": "List", "AudioDeviceOpenText": "Record", - "AudioDeviceCloseText": "Stop" + "AudioDeviceCloseText": "Stop", + "AudioDevicePauseText": "Pause", + "AudioDeviceResumeText": "Resume", + "AudioDeviceDownloadText": "Download" } } diff --git a/src/BootstrapBlazor.Server/Locales/zh-CN.json b/src/BootstrapBlazor.Server/Locales/zh-CN.json index f35f000f138..a8881f92588 100644 --- a/src/BootstrapBlazor.Server/Locales/zh-CN.json +++ b/src/BootstrapBlazor.Server/Locales/zh-CN.json @@ -7139,6 +7139,7 @@ "AudioDeviceOpenText": "录音", "AudioDeviceCloseText": "停止", "AudioDevicePauseText": "暂停", - "AudioDeviceResumeText": "恢复" + "AudioDeviceResumeText": "恢复", + "AudioDeviceDownloadText": "下载" } } From e0a85e90b275c9ca9af7c2ff2f7b903a61c4d3e9 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Mon, 5 May 2025 16:16:33 +0800 Subject: [PATCH 7/7] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=E7=A4=BA=E4=BE=8B?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Samples/AudioDevices.razor | 2 +- .../Components/Samples/AudioDevices.razor.cs | 7 +++++-- .../Components/Samples/VideoDevices.razor.cs | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Samples/AudioDevices.razor b/src/BootstrapBlazor.Server/Components/Samples/AudioDevices.razor index 0922b5d574f..a947fd7d90a 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/AudioDevices.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/AudioDevices.razor @@ -17,7 +17,7 @@ private IAudioDevice? AudioDeviceService { get; set; } - +
diff --git a/src/BootstrapBlazor.Server/Components/Samples/AudioDevices.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/AudioDevices.razor.cs index 43a73bb7df7..a5f57b8e344 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/AudioDevices.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Samples/AudioDevices.razor.cs @@ -24,6 +24,8 @@ public partial class AudioDevices : IAsyncDisposable private bool _isOpen = false; + private bool _isDownload = false; + private async Task OnRequestDevice() { var devices = await AudioDeviceService.GetDevices(); @@ -52,8 +54,9 @@ private async Task OnOpen() private async Task OnClose() { - _isOpen = false; await AudioDeviceService.Close(".bb-audio"); + _isOpen = false; + _isDownload = true; } private async Task OnDownload() @@ -61,7 +64,7 @@ private async Task OnDownload() var stream = await AudioDeviceService.GetData(); if (stream != null) { - await DownloadService.DownloadFromStreamAsync("data.wav", stream); + await DownloadService.DownloadFromStreamAsync($"data_{DateTime.Now:HHmmss}.wav", stream); } } diff --git a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs index 46d1b06ae95..f25c4b56680 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Samples/VideoDevices.razor.cs @@ -69,7 +69,7 @@ private async Task OnDownload() var stream = await VideoDeviceService.GetPreviewData(); if (stream != null) { - await DownloadService.DownloadFromStreamAsync("preview.png", stream); + await DownloadService.DownloadFromStreamAsync($"preview_{DateTime.Now:HHmmss}.png", stream); } }