在 Windows 8 应用程序中播放生成的缓冲区中的声音

2023-11-24

我正在将一些 C# Windows Phone 7 应用程序移植到 Windows 8。

手机应用程序使用 XNA音效从缓冲区播放任意声音。在最简单的情况下,我只需创建所需持续时间和频率的正弦波。持续时间和频率都可能有很大差异,因此我不想依赖 MediaElements(除非有某种方法可以改变基本文件的频率,但这只会帮助我生成单频)。

WinRT 中 XNA SoundEffectInstance 的等效项是什么?

我假设我需要使用 DirectX 来实现此目的,但我不确定如何从其他 C#/XAML 应用程序中实现此目的。我看过SharpDX,但它似乎没有我认为需要使用的 DirectSound、SecondaryBuffer、SecondaryBuffer 类。

我在上面做了一些假设。可能是我正在寻找错误的类,或者有一种完全独立的方法可以从 Windows 8 应用程序生成任意声音。


I found 使用 SharpDX 的 XAudio2 通过 AudioBuffer 播放 wav 文件的示例。这看起来很有希望,我只需要用生成的音频缓冲区替换本机文件流即可。

PM> 安装包 SharpDX

PM> 安装包 SharpDX.XAudio2

    public void PlaySound()
    {
        XAudio2 xaudio;
        MasteringVoice masteringVoice;

        xaudio = new XAudio2();
        masteringVoice = new MasteringVoice(xaudio);

        var nativefilestream = new NativeFileStream(
            @"Assets\SpeechOn.wav",
            NativeFileMode.Open,
            NativeFileAccess.Read,
            NativeFileShare.Read);

        var soundstream = new SoundStream(nativefilestream);


        var waveFormat = soundstream.Format;
        var buffer = new AudioBuffer
        {
            Stream = soundstream.ToDataStream(),
            AudioBytes = (int)soundstream.Length,
            Flags = BufferFlags.EndOfStream
        };

        var sourceVoice = new SourceVoice(xaudio, waveFormat, true);

        // There is also support for shifting the frequency.
        sourceVoice.SetFrequencyRatio(0.5f);

        sourceVoice.SubmitSourceBuffer(buffer, soundstream.DecodedPacketsInfo);

        sourceVoice.Start();
    }

在 Win8RT 中生成动态声音的唯一方法是使用 XAudio2,因此您应该能够使用 SharpDX.XAudio2 来做到这一点。

不使用 NativeFileStream,只需实例化一个 DataStream 直接提供托管缓冲区(或者您可以使用非托管缓冲区或让 DataStream 为您实例化一个缓冲区)。代码如下:

// Initialization phase, keep this buffer during the life of your application
// Allocate 10s at 44.1Khz of stereo 16bit signals
var myBufferOfSamples = new short[44100 * 10 * 2];

// Create a DataStream with pinned managed buffer
var dataStream = DataStream.Create(myBufferOfSamples, true, true);

var buffer = new AudioBuffer
        {
            Stream = dataStream,
            AudioBytes = (int)dataStream.Length,
            Flags = BufferFlags.EndOfStream
        };

//...
// Fill myBufferOfSamples
//...

// PCM 44.1Khz stereo 16 bit format
var waveFormat = new WaveFormat();

XAudio2 xaudio = new XAudio2();
MasteringVoice masteringVoice = new MasteringVoice(xaudio);
var sourceVoice = new SourceVoice(xaudio, waveFormat, true);

// Submit the buffer
sourceVoice.SubmitSourceBuffer(buffer, null);

// Start playing
sourceVoice.Start();

用正弦波填充缓冲区的示例方法:

    private void FillBuffer(short[] buffer, int sampleRate, double frequency)
    {
        double totalTime = 0;

        for (int i = 0; i < buffer.Length - 1; i += 2)
        {
            double time = (double)totalTime / (double)sampleRate;
            short currentSample = (short)(Math.Sin(2 * Math.PI * frequency * time) * (double)short.MaxValue);

            buffer[i] = currentSample; //(short)(currentSample & 0xFF);
            buffer[i + 1] = currentSample; //(short)(currentSample >> 8);

            totalTime += 2;
        }

    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Windows 8 应用程序中播放生成的缓冲区中的声音 的相关文章

随机推荐

  • _jspService 超出 65535 字节限制

    因此 我正在处理在 Websphere 7 JDK 6 上运行的遗留 servlet 代码 开发环境设置使用Tomcat 6 JDK 6 为什么它可以在 Websphere 7 上运行 Tomcat 6 中没有吗 这是否与以下内容有关 应用
  • 为什么 dict_items 对象不支持索引?

    我知道你可以投dict items into a list允许项目索引 但不知道为什么直接不允许这个操作 是不是因为dict items对象是生成器 如果是这样 当我看到 gt gt gt foo bar baz qux items dic
  • 禁用 DropDownList razor mvc

    在我的剃刀视图中 我使用下拉列表 我想禁用此控件 不可选择 我的代码是 div class field list Html DropDownListFor model gt model LinguaCodiceMadre Model Lin
  • 在这种情况下,“向服务器发出两个请求”的实际含义是什么?

    在学习 HTML 教程时HTML 链接章节在 w3schools com 上我看到以下句子 如果子文件夹地址上没有正斜杠 您可能会向服务器生成两个请求 许多服务器会自动在地址中添加正斜杠 然后创建新请求 我不明白如果锚标记的 href 属性
  • webgl 画布的 toDataURL() 返回透明图像[重复]

    这个问题在这里已经有答案了 我无法让 toDataUrl 工作 这是我的代码 我试图获取画布的图像并将其用作现有图像元素的源 var canvas document getElementById glcanvas canvas setAtt
  • 将 Html 转换为 Pdf 时显示 Unicode 字符

    我正在使用 itextsharp dll 将 HTML 转换为 PDF HTML 有一些 Unicode 字符 例如 当我尝试将 HTML 转换为 PDF 时 PDF 中不显示 Unicode 字符 我的功能 Document doc ne
  • 如何通过Spark(外部hadoop集群)中的H/A名称节点组成的URI访问hdfs?

    现在我有一些 Spark 应用程序将输出存储到 HDFS 由于我们的hadoop集群由namenode H A组成 而spark集群位于hadoop集群之外 我知道这很糟糕 我需要为应用程序指定HDFS URI 以便它可以访问HDFS 但它
  • 将 Google Vision API 响应转换为 JSON

    Task 将 Google Vision API 响应转换为 JSON Problem API调用返回值不是JSON格式 Python函数 def detect logos path Detects logos in the file cl
  • 为什么 TabListener 已被弃用?

    在 Android 5 API 级别 21 中ActionBar TabListener已被弃用 为什么 我们应该用什么来代替 这是否意味着操作选项卡作为 UI 元素已被弃用 或者是否有新的方法来实现它们 看这个例子滑动选项卡基础知识如果您
  • JavaScript,停止额外的事件监听器

    想象一下我有这样的代码 var myFunc1 function event alert 1 var myFunc2 function event alert 2 element addEventListener click myFunc1
  • 在编译时查找基类

    标题几乎说明了一切 C 中是否有一种方法可以在编译时获取类的基类型 IE 是否可以将一个类传递给模板 并让模板使用其他模板来传递给定类的基类 我的问题不是我是否可以自己实现这样的功能 毫无疑问我可以 使用特征等 我的问题是是否有一些 模糊的
  • 如何知道 Parse.initialize() 何时已被调用?

    现在我使用静态布尔值来判断初始化何时发生 有没有更简单的方法可以知道我已经调用过初始化 谢谢你 解决了 非常感谢您的评论 您需要在扩展应用程序的类中初始化解析 然后将其作为应用程序 而不是其他活动 添加到清单文件中 这是我使用 Parse
  • MongoDb 的 C# 驱动程序:如何使用 limit+count?

    来自 MongoDb 文档 在使用skip 和limit 的查询中 count默认忽略这些参数 使用 count true 让它在计算中考虑跳过值和限制值 这正是我需要计算特定查询的结果元素的数量 直到它超过定义的限制 如 1000 但我在
  • Kafka如何读取__consumer_offsets主题

    我正在尝试找出我当前的高级消费者正在发挥哪些作用 我使用 Kafka 0 8 2 1 noKafka 的 server properties 中设置的 offset storage 我认为这意味着偏移量存储在 Kafka 中 我还通过在 Z
  • 如何在 Angular 2 客户端应用程序中隐藏/保护 API 密钥?

    我正在开发 Angular 2 应用程序 我正在从我的服务中进行多个 API 调用 但我不想发布密钥 我知道使用后端的密钥是首选方法 但肯定有一种方法可以从前端执行此操作 我一直在研究如何在前端有效隐藏 API 密钥 但没有找到任何关于如何
  • 交叉引用组件

    我的 net 解决方案中有三个项目 主要项目和两个类库项目 我发现我需要交叉引用类库项目 我可以这样做吗 安全吗还是有一些注意事项 当项目位于一个解决方案中时 IDE 不会允许您这样做 有一些微妙的方法可以混淆它 但是 由于程序集引用尚不可
  • 派生类中的显式模板静态成员实例化

    我正在尝试使用静态成员实现模板类 从模板类派生的类应该被实例化 而不需要编写额外的代码 这是我天真的 并且不成功 的方法 单例 h template
  • 为什么没有非整数枚举?

    为什么不能创建非整数枚举 我想知道这是否 是语言设计决策 或者在编译器中实现此决策是否存在问题 换句话说 在语言中实现非整数枚举是否可行 但只是没有合理的需求 或者 如果它不可行但合理 那么有什么障碍 请有人告诉我 C 中没有此功能的原因或
  • 在 Swift 中将 MKMapPoint 转换为 NSValue

    我想将 MKMapPoint 转换为 NSValue 在 Objective C 中我可以用下面的语句来做到这一点 MKMapPoint point MKMapPointForCoordinate location coordinate N
  • 在 Windows 8 应用程序中播放生成的缓冲区中的声音

    我正在将一些 C Windows Phone 7 应用程序移植到 Windows 8 手机应用程序使用 XNA音效从缓冲区播放任意声音 在最简单的情况下 我只需创建所需持续时间和频率的正弦波 持续时间和频率都可能有很大差异 因此我不想依赖