89173


### 背景

C++を使って音声録音・加工・プレイバックを行えるアプリを作成しています。音声関連の処理をpopenによりsoxをサブプロセスとして呼び出すことで実現しようと考えているのですが、録音処理の実装でエラーが出てしまいます。どなたか原因、解決策をご教授いただけないでしょうか。

### 問題

エラーの起きたミニマムコードが以下です。2チャネル16000Hzで30秒間の録音データをsample.wavに保存しようとしています。

[code]

    #include <cstdio>
    #include <algorithm>
    
    int main()
    {
        FILE* fp = popen("sox -t waveaudio -c 2 -r 16000 -d sample.wav trim 0 30", "r");
        char buf[1025];
        while(fgets(buf, 1024, fp) != nullptr) {
            std::printf("%s", buf);
            std::fill(std::begin(buf), std::end(buf), 0);
        }
    
        pclose(fp);
    }
    
[/code]

これを実行すると

[code]

    sox FAIL formats: can't open input  `default': WaveAudio waveInOpen failed with code 11: 間違ったフォーマットのプログラ
    ムを読み込もうとしました。
    
[/code]

というエラーが表示されて録音に失敗します。

### やったこと

system関数やCreateProcess関数を用いたところ同じエラーで失敗します。  
一方でCommand Prompt・Powershellで同じコマンドを実行した場合にはエラーが出ず録音に成功しました。

### 環境

OS：Windows 10 Pro(21H2)  
OSビルド：19044.1706  
C++：MingW-W64 11.2.0  
audio：リモートオーディオ(リモート録音有効化済み)


CC BY-SA 4.0
2022-05-28T11:19:05.430
89105
2022-06-01T05:25:11.077
2022-05-28T12:51:27.447
4236
32650
question
c++ windows
SoX (Sound Exchange)をC++からpopenを使って呼び出すと”sox FAIL formats”エラーが起きて録音に失敗する


> code 11: 間違ったフォーマットのプログラムを読み込もうとしました。

と出ています。これは [`ERROR_BAD_FORMAT`](https://docs.microsoft.com/ja-
jp/windows/win32/debug/system-error-codes--0-499-#ERROR_BAD_FORMAT)
を表します。このエラーが発生するパターンとしてよく見かけるのは、32bitプロセスに64bit
DLLを読み込もうとした、またはその逆です。ともあれ、このエラーはどのようなファイルを読み込もうとして失敗したのかがイベントログに記録されますので確認することをお勧めします。

質問は単に`sox`を起動しただけで明示的にDLLを読み込む処理をしたわけではありませんので、`sox`の起動条件が正しくなかったということでしょう。その意味では

  * 成功 
    * Command Prompt
    * Powershell
  * 失敗 
    * `popen()`
    * `system()`
    * `CreateProcess()`

という差からの想像ですが、成功するパターンではカレントディレクトリが`sox`をインストールしたディレクトリなのではないでしょうか？
また失敗するパターンではカレントディレクトリを意識せず、例えば作られたプログラムの置かれているディレクトリだったりするのではないでしょうか？

想像に想像を重ねていますが、どのDLLで失敗したのかまでは推測できません（それでも挙げるならば`zlib1.dll`かなぁ…）。ここまでの推測が正しかった場合に雑に対処するならばカレントディレクトリを`sox`をインストールしたディレクトリに変更すれば成功するでしょうか。


CC BY-SA 4.0
2022-05-28T12:51:17.707
89108
2022-05-28T12:51:17.707
4236
89105
answer


自己解決しました．

<https://answers.microsoft.com/en-us/windows/forum/all/waveinopen-returns-
error-11/64202fa2-c422-4680-84ef-3a1433cb33bf>

セキュリティソフト（Kaspersky）の影響でエラーが起きていました．  
セキュリティソフトの信頼するアプリケーションリストにsoxを追加すれば動作します．


CC BY-SA 4.0
2022-06-01T05:25:11.077
89173
2022-06-01T05:25:11.077
32650
89105
answer