[C++] 147 FLTK : Fl_Multiline_Outputの折り返し設定

[M1 Mac, Big Sur 11.6.8, clang 13.0.0, FLTK 1.3.8, NO IDE]

結構長い期間の懸案だったFl_Multiline_Outputの折り返し設定ができました。

公式サイトの”Fl_Input_ Class Reference” – “Detailed Description”に説明がありました。上位クラスにあるとは思っていましたが、Fl_InputではなくFl_Input_なのが盲点でした。ちなみに折り返しは英語ではwrapになります。

Fl_Multiline_Output outputLine = new Fl_Multiline_Output(10,165,340,130,"My Output");
    outputLine->color(fl_rgb_color(188,226,232)); // みずいろ
    outputLine->labelcolor(fl_rgb_color(255,255,255));
    outputLine->textsize(12);
    outputLine->align(Fl_Align(FL_ALIGN_TOP_RIGHT)); // ラベルの配置
    outputLine->type(FL_MULTILINE_OUTPUT_WRAP); // 折り返し設定
    outputLine->labelsize(10);

[C++] 146 FLTK : アプリ内コマンドは絶対パス FFmpeg

[M1 Mac, Big Sur 11.6.8, clang 13.0.0, FLTK 1.3.8, NO IDE]

ffmpegコマンドをアプリ内で実行する際、コマンドは絶対パスにしないと動作しません。コンソール付き実行ファイルではコマンド名だけで動作するものの、appファイルでは動かないです。

ffmpegコマンドの標準出力はpopenで捉えられませんでしたが、movからmp4への変換自体はできたのでよしとします。

22/8/18追記:
FFmpegの公式サイトからffmpeg-107780-g6ded80af92.7zをダウンロードして実行ファイルを使ってみたところ、MacOSがカーネル機能拡張されたとかでパニック修復ブートにて再起動し、その後再起動を繰り返すようになりました。
ディスクユーティリティのFirst Aidでは直らなかったので、TimeMachineで復元し、復活させました。偶然かもしれませんが、取扱は慎重にした方が良さそうです。MacOSの場合はHomebrewからもインストールできます。こちらは問題ありませんでした。
これまでFirst Aidが修復に貢献したことは一度もなく時間の無駄なので、今後は即TimeMachineで復元します。走り出したら中断できないのも低評価です。

void outputTextMake(string cmd){
    char str[READ_SIZE];
    size_t ret;

    FILE* fp = popen(cmd.c_str(), "r");
    FILE* fo = fopen(outputText, "a+");

    while(1){
        ret = fread(str, sizeof(char), READ_SIZE, fp);
        fwrite(str, sizeof(char), ret, fo);
        
        if(ret < READ_SIZE){
            break; 
        } 
    }

    // 文字列追記
    string finish = "変換完了\n";
    fprintf(fo, "%s", finish.c_str());

    pclose(fp);
    fclose(fo);
}

void formatConvert(){
    string path2;

    // フォーマットリストのindex取得
    int formatNum = choice->value();

    // 変換元のファイルパス取得
    const char* path = input_line->value();
    cout << "path "<< path << endl;

    // stringへ変換
    string path_str = string(path);

    // ファイルパスに半角スペースが含まれる場合はこれをアンダースコアに置換したファイル名に変更
    if (path_str.find(" ") != std::string::npos)
    {
        path2 = spt.splitJoin2(path_str, " ", "_", 0, -1);

        // 元ファイルをリネーム
        rename(path, path2.c_str());
    } else {
        path2 = path_str;
    }

    cout << "path2 "<< path2 << endl;

    // 自製ライブラリSplitによりファイル名から拡張子を削除
    string prefix = spt.splitJoin(path2, ".", 0, -2);
    cout << "prefix "<< prefix << endl;

    // 変換先のファイルパス作成
    string path3 = prefix + fmt[formatNum];
    cout << "path3 "<< path3 << endl;

    // ファイル変換コマンド作成(ffmpegは絶対パス)
    string cmd = "/opt/homebrew/Cellar/ffmpeg/5.1/bin/ffmpeg -i " + path2 + " -f " + fmt[formatNum] + " " + path3 + " && echo ffmpeg完了";
    cout << "cmd: "<< cmd << endl;
    output_line->insert("cmd: ");
    output_line->insert(cmd.c_str());
    output_line->insert("\n");

    outputTextMake(cmd);
    browser->load(outputText);

    cout << "フォーマット変換完了!" << endl;
}