Как преобразовать CoreDispatcher в DispatcherQueue для обработчика событий AudioGraphC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как преобразовать CoreDispatcher в DispatcherQueue для обработчика событий AudioGraph

Сообщение Anonymous »

Поскольку CoreDispatcher устарел в WinUI 3 Windows App SDK и заменен DispatcherQueue, как можно преобразовать следующий код для правильного использования DispatcherQueue?
fileInputNode.FileCompleted += FileInputNodeOnFileCompleted;

private async void FileInputNodeOnFileCompleted(AudioFileInputNode sender, object args)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
sender.Stop();
sender.Reset();
});
}

Еще одна причина обновить код для использования DispatcherQueue заключается в том, что при использовании CoreDispatcher в коде возникает следующая ошибка:

Ссылка на объект не установлена ​​на экземпляр объекта.

ИЗМЕНИТЬ
По запросу YangXiaoPo-MSFT вот воспроизводимый образец тестового приложения, содержащего проблему.
Ниже приведен относящийся к ней XAML:








И следующий код:
using Microsoft.UI.Xaml;
using System;
using System.Threading.Tasks;
using Windows.Media.Audio;
using Windows.Media.MediaProperties;
using Windows.Storage;
using Windows.Media.Transcoding;
using Windows.Media.Capture;
using Windows.Media.Render;
using Microsoft.UI.Dispatching;

namespace Test_3_Take_2
{

public sealed partial class MainWindow : Window
{

private AudioGraph graph, graph2;
private AudioFileInputNode fileInputNode;
private AudioFileOutputNode fileOutputNode;
private AudioDeviceOutputNode deviceOutputNode, deviceOutputNode2;
private AudioDeviceInputNode deviceInputNode;
private StorageFolder temporaryFolder = ApplicationData.Current.TemporaryFolder;
private StorageFile file;
public MainWindow()
{
this.InitializeComponent();

this.Title = "Test 3 Take 2";

var root = this.Content as FrameworkElement;
if (root != null)
root.Loaded += async (s, e) => await CreateAudioGraph();

var root2 = this.Content as FrameworkElement;
if (root2 != null)
root2.Loaded += async (s, e) => await CreateAudioGraph2();
}

private void playButton_Click(object sender, RoutedEventArgs e)
{

if (file != null)
{

TogglePlay();

}

}

private async void TogglePlay()
{
//Toggle playback
if (playButton.Content.Equals("Play Recorded File"))
{
if (fileInputNode != null) {

fileInputNode.Dispose();

}
CreateAudioFileInputNodeResult fileInputResult = await graph2.CreateFileInputNodeAsync(file);
if (AudioFileNodeCreationStatus.Success != fileInputResult.Status)
{
// Cannot read input file
return;
}

fileInputNode = fileInputResult.FileInputNode;

fileInputNode.AddOutgoingConnection(deviceOutputNode2);

fileInputNode.StartTime = TimeSpan.FromSeconds(0);

graph2.Start();

playButton.Content = "Stop Playing Recorded File";

fileInputNode.FileCompleted += FileInputNodeOnFileCompleted;

if (fileInputNode.Position == TimeSpan.FromSeconds(0))
{
graph2.Stop();
playButton.Content = "Play Recorded File";

}

}
else
{
graph2.Stop();
playButton.Content = "Play Recorded File";

}
}

private async void FileInputNodeOnFileCompleted(AudioFileInputNode sender, object args) {
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
sender.Stop();
sender.Reset();
}); }

private async void recordStopButton_Click(object sender, RoutedEventArgs e)
{

await ToggleRecordStop();

}

private async Task ToggleRecordStop()
{

if (recordStopButton.Content.Equals("Record"))
{

playButton.Content = "Play Recorded File";
playButton.IsEnabled = false;

if (deviceInputNode != null)
{

deviceInputNode.Dispose();

CreateAudioDeviceInputNodeResult deviceInputNodeResult = await graph.CreateDeviceInputNodeAsync(MediaCategory.Other);
if (deviceInputNodeResult.Status != AudioDeviceNodeCreationStatus.Success)
{
// Cannot create device input node
return;
}

deviceInputNode = deviceInputNodeResult.DeviceInputNode;

}

file = await temporaryFolder.CreateFileAsync("file1.mp3",
CreationCollisionOption.ReplaceExisting);
// File can be null if cancel is hit in the file picker
if (file == null)
{
return;
}

MediaEncodingProfile fileProfile = MediaEncodingProfile.CreateMp3(AudioEncodingQuality.High);

// Operate node at the graph format, but save file at the specified format
CreateAudioFileOutputNodeResult fileOutputNodeResult = await graph.CreateFileOutputNodeAsync(file, fileProfile);

if (fileOutputNodeResult.Status != AudioFileNodeCreationStatus.Success)
{
// FileOutputNode creation failed
return;
}

fileOutputNode = fileOutputNodeResult.FileOutputNode;

// Connect the input node to both output nodes
deviceInputNode.AddOutgoingConnection(fileOutputNode);
deviceInputNode.AddOutgoingConnection(deviceOutputNode);
graph.Start();
recordStopButton.Content = "Stop";

}
else if (recordStopButton.Content.Equals("Stop"))
{
// Good idea to stop the graph to avoid data loss
graph.Stop();

TranscodeFailureReason finalizeResult = await fileOutputNode.FinalizeAsync();
if (finalizeResult != TranscodeFailureReason.None)
{
// Finalization of file failed. Check result code to see why
return;
}

recordStopButton.Content = "Record";
playButton.IsEnabled = true;
}
}

private async Task CreateAudioGraph()
{
AudioGraphSettings settings = new AudioGraphSettings(AudioRenderCategory.Media);
settings.QuantumSizeSelectionMode = QuantumSizeSelectionMode.LowestLatency;

CreateAudioGraphResult result = await AudioGraph.CreateAsync(settings);

if (result.Status != AudioGraphCreationStatus.Success)
{
// Cannot create graph
return;
}

graph = result.Graph;

// Create a device output node
CreateAudioDeviceOutputNodeResult deviceOutputNodeResult = await graph.CreateDeviceOutputNodeAsync();
if (deviceOutputNodeResult.Status != AudioDeviceNodeCreationStatus.Success)
{
// Cannot create device output node

return;
}

deviceOutputNode = deviceOutputNodeResult.DeviceOutputNode;

// Create a device input node using the default audio input device
CreateAudioDeviceInputNodeResult deviceInputNodeResult = await graph.CreateDeviceInputNodeAsync(MediaCategory.Other);
if (deviceInputNodeResult.Status != AudioDeviceNodeCreationStatus.Success)
{
// Cannot create device input node
return;
}

deviceInputNode = deviceInputNodeResult.DeviceInputNode;

}

private async Task CreateAudioGraph2()
{
// Create an AudioGraph with default settings
AudioGraphSettings settings = new AudioGraphSettings(AudioRenderCategory.Media);
CreateAudioGraphResult result = await AudioGraph.CreateAsync(settings);

if (result.Status != AudioGraphCreationStatus.Success)
{
// Cannot create graph
return;
}

graph2 = result.Graph;

// Create a device output node
CreateAudioDeviceOutputNodeResult deviceOutputNodeResult = await graph2.CreateDeviceOutputNodeAsync();

if (deviceOutputNodeResult.Status != AudioDeviceNodeCreationStatus.Success)
{

return;
}

deviceOutputNode2 = deviceOutputNodeResult.DeviceOutputNode;

}

}

}


Подробнее здесь: https://stackoverflow.com/questions/786 ... nt-handler
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»