小编Rob*_*Rob的帖子

C:将参数从可变参数函数传递给可变参数宏

我的 C 代码中内置了一个标准的日志 API,这是一个很好的简单的logF(const char *pFormat, ...)东西,到目前为止,它一直被映射到vprintf(),即:

void logF(const char *pFormat, ...)
{
    va_list args;
    va_start(args, pFormat);
    vprintf(pFormat, args);
    va_end(args);
}
Run Code Online (Sandbox Code Playgroud)

此 API 上方的 C 代码必须适用于多个嵌入式平台。我刚刚到达了一个平台 (Nordic NRF52840),在该平台中,我必须使用的底层日志记录接口显示为表单的可变参数宏NRF_LOG_INFO(...)

问题:如何正确传递fn(const char *pFormat, ...)BLAH(...)宏?我的脑袋疼....

这是 GCC 4.9.3,不过如果有一个对 C 编译器版本相对宽松的解决方案会很好。

编辑 1:注意到我可以将我的logF()函数重新定义为可变参数宏并将其映射到那里,问题是我将拥有一个特定于平台的头文件而不是通用头文件,我必须将它移到平台中代码,每个都有一个。并非不可能,但更混乱。

编辑 2:我被问到如何NRF_LOG_INFO()扩展的线索。这是预处理器的相关输出:

#define NRF_LOG_INFO(...) NRF_LOG_INTERNAL_INFO( __VA_ARGS__)

#define NRF_LOG_INTERNAL_INFO(...) NRF_LOG_INTERNAL_MODULE(NRF_LOG_SEVERITY_INFO, NRF_LOG_SEVERITY_INFO, __VA_ARGS__)

#define NRF_LOG_INTERNAL_MODULE(level,level_id,...) if (NRF_LOG_ENABLED && (NRF_LOG_LEVEL >= level) && (level <= NRF_LOG_DEFAULT_LEVEL)) { if (NRF_LOG_FILTER >= …
Run Code Online (Sandbox Code Playgroud)

c macros variadic

6
推荐指数
1
解决办法
228
查看次数

如何调试 Linux I2S 音频输入问题

我正在尝试将 I2S 麦克风 (Invensense ICS43432) 连接到运行 Arch Linux 的 Raspberry Pi (B+),但失败了。我已经在相关的 Arch Linux ARM 论坛中寻求了具体的建议,但我的问题实际上比这更笼统:如何调试 Linux 音频输入问题?

我已经使用逻辑分析仪验证了 I2S 麦克风正在正确的通道(左)和 Raspberry Pi 的正确引脚中发送敏感数据。I2S 麦克风在 ALSA 下显示为“声卡”。 arecord我非常高兴从该设备进行录音,并且我已将该设备的增益提高了alsamixer30 dB。然而记录文件的所有数据字节都是零。

在Linux下如何检查音频数据流、DMA操作?

linux debugging alsa dma raspberry-pi

5
推荐指数
1
解决办法
1041
查看次数

Javascript HTML5 视频事件无法在 Safari 上触发

我有一个包含 Javascript 的 HTML 页面,该页面旨在允许视频(在这种情况下实际上只是音频内容)在任何浏览器上使用 HTTP Live Streaming 播放。在大多数情况下,它使用,hls.js但在 Apple 产品的情况下,我需要做不同的事情,因为 Safari 具有本机 HLS 支持。

全文转载如下,但重要的几行是:

else if (video.canPlayType('application/vnd.apple.mpegurl')) {
    video.src = 'music.m3u8';
    video.addEventListener('canplay', startPlaying);
    //document.addEventListener('DOMContentLoaded', startPlaying);
}
Run Code Online (Sandbox Code Playgroud)

应该发生的是,当canplay事件触发时,该startPlaying()函数被调用,这使得一个按钮可见,用户可以按下该按钮开始播放视频。但是,在我朋友的 iPhone 8plus (iOS 11.3.1) 上,这不起作用:没有任何按钮可见。相反,如果我注释掉该video.addEventListener()行并将其替换为该document.addEventListener()行,则一切正常:按钮可见,他可以播放流。

谁能发现我做错了什么?可能是一个新的错误,因为我对这个网络/脚本的东西不是很熟悉,让我流鼻血......当然,我可以将它留在 DOM 加载方法中,但这是不对的,我宁愿是对的.

<!DOCTYPE html PUBLIC "-//Netscape Comm. Corp.//DTD HTML//EN">
<html>
<script src="hls.js/dist/hls.js"></script>

<head><meta http-equiv="content-type" content="text/html; charset=UTF-8"></head>
<body>
<video id="video"></video>
<button id="play" hidden>Loading</button>
<script>
'use strict';
var video = document.getElementById('video');
var playButton = document.getElementById('play'); …
Run Code Online (Sandbox Code Playgroud)

javascript safari html5-video

4
推荐指数
1
解决办法
6124
查看次数

跨平台C代码并防止垃圾收集

我有一组C函数,我需要在ARM目标,C++和C#中使用.我可以成功地将C包装成C++ DLL,然后成为C#DLL并使用我已成功绑定的所有C函数.但是,我有一个调试功能,我希望能够打印到C#GUI,它使用的委托是垃圾收集而不是留在原地.

托管调试助手'CallbackOnCollectedDelegate'在'C:\ utm\pc\utm_win32_app\bin\Debug\utm_win32_app.vshost.exe'中检测到问题.

附加信息:对类型为'utm_dll_wrapper_cs!MessageCodec.MessageCodec_dll + guiPrintToConsoleCallback :: Invoke'的垃圾回收委托进行了回调.这可能会导致应用程序崩溃,损坏和数据丢失.将委托传递给非托管代码时,托管应用程序必须将它们保持活动状态,直到确保它们永远不会被调用.

以下是使用和设置回调的C代码片段mp_guiPrintToConsole:

#ifdef WIN32
static void (* mp_guiPrintToConsole) (const char*) = NULL;

void logMsg (const char * pFormat, ...)
{
    char buffer[MAX_DEBUG_MESSAGE_LEN];

    va_list args;
    va_start (args, pFormat);
    vsnprintf (buffer, sizeof (buffer), pFormat, args);
    va_end (args);
#ifdef WIN32
    if (mp_guiPrintToConsole)
    {
        (*mp_guiPrintToConsole) (buffer);
    }
#else
    // Must be on ARM
    printf (buffer);
#endif
}

void  initDll (void (*guiPrintToConsole) (const char *))
{
#ifdef WIN32
    mp_guiPrintToConsole = guiPrintToConsole; 
    // This is the …
Run Code Online (Sandbox Code Playgroud)

c# delegates cross-platform

2
推荐指数
1
解决办法
595
查看次数