【问题标题】:Write float values to Pointer Array of float in C# (unsafe or safe) using AVAudioPCMBuffer使用 AVAudioPCMBuffer 将浮点值写入 C# 中的浮点指针数组(不安全或安全)
【发布时间】:2015-02-04 15:07:39
【问题描述】:

虽然我不太习惯在 C# 中使用不安全的上下文,但我知道有时我可能不得不使用它。

为了解决这个问题,为了将字节值写入 IntPtr,我可以从安全的上下文中编写以下内容:

for (int i = 0; i < counter; i++) 
{
    System.Runtime.InteropServices.Marshal.WriteByte (data, i, 0);
}

如何在不安全的环境中做同样的事情?

更具体地说,我实际上是在尝试将浮点值写入一个 Intptr 变量,该变量实际上是一个浮点数组指针。我没有看到任何能够在安全上下文中使用 System.Runtime.InteropServices 处理写入浮点数据的重载。

我尝试了以下但得到错误:

malloc: *** 对象 0x17e9eca4 错误:已释放对象的校验和不正确 - 对象可能在被释放后被修改。

var data = (float*)buffer.FloatChannelData;

for (int i = 0; i < buffer.FrameLength; i++) 
{
    data [i] = 0.0f;
    *data++ = 0.0f; // also tried this but got the same error
}

非常感谢您的帮助。

其他详情:

我正在尝试将数据写入 Xamarin.IOS 中的 AudioPCMBuffers。我认为缓冲区包含一个浮点数组,但正如 @Passant 在 cmets 中指出的那样,它实际上包含一个指向帧长度浮点数组的指针数组。他同样的前提适用,无论是从安全还是不安全的上下文中,我都希望能够将数据写入缓冲区。一个例子会很有帮助。感谢并为您的困惑道歉

【问题讨论】:

  • 郑重声明,我使用 C# 已经有十多年了,我从来不需要使用 unsafe 块。
  • @Mann 我也很高兴在安全的环境中工作。关于如何在安全的环境中解决问题的任何建议?即将浮点值写入浮点数组指针
  • 闻起来像 AVAudioPCMBuffer,我想知道为什么我们必须猜测它。这不是一个浮点数组,它是一个指向 frameLength 浮点数组的指针数组(它们的 channelCount)。因此,如果那是准确的,那么您确实会破坏 bejeezus 的内存。
  • @Passant 你完全正确地认为这是一个 AVAudioPCMBuffer。我从来没有打算让你猜测任何事情。相反,我试图尽可能缩小问题范围,以使问题非常具体。我将编辑问题以包含此详细信息。随意提供有关如何访问指针数组的解决方案。

标签: ios .net c#-4.0 mono xamarin.ios


【解决方案1】:

Rolf's 问题的答案在这里:

试试这个:https://gist.github.com/rolfbjarne/dc947383a6c9172bc664

它将麦克风输入与正弦波混合。

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 2014-07-20
    相关资源
    最近更新 更多