こちらの件、誠に差し出がましいこととは存じますが、
MicrosoftのADPCMの仕様書を参照しながら
c言語でADPCM <-> LinearPCMの相互変換を行うコードを記述致しました。
スタンドアロンでの動作は確認を行いましたが、
xrdp本体への組み込みと結合テストは未実施である事、ご承知おきください。
添付のmsadpcm.cが当該のコードになります。
当該のコードは、
「ADPCMへの圧縮処理」
「LinearPCMへの展開処理」
「RIFFヘッダのパースと生成処理」
が含まれており、スタンドアロンで動作の確認が出来るようになっております。
(引数として、入力ファイル名と、出力ファイル名を与えて実行します。
入力ファイルの内容に応じて、
圧縮処理を行うか、展開処理を行うか、自動的に判別し処理を行います)
開発はVisualStudio2019上で行い、
LinearPCM<->ADPCMの相互変換が正常に行われることを確認しました。
gcc 4.8.5@CentOS7.7で、コンパイルが通ることも確認しております。
xrdpのコード規約に準拠させたつもりですが、
仕様書に記載のある変数名に関しては、
仕様書の記載を優先し、camelCaseになっております。
LinearPCM->ADPCMへの圧縮処理は660行目までの各関数群となります。
当該の部分をsesman/chansrv/sound.cに組み込んだのち、
上位層でADPCMへの圧縮をサポートするように
sound_wave_compress_adpcm函数を呼び出すコードを記述すれば、
動作するのはないかと思われます。
同様に、661行目から931行目までのADPCM->LinearPCMの展開処理を
録音側(client -> xrdp server)のコードに組み込めば、
端末からの録音処理にも対応出来ると思われます。
圧縮処理と展開処理の実行には、やや、時間が掛かります。
(XeonGold6132 * 2の実行環境下で
7分の長さの44100Hz-2chのwaveを圧縮するのにおおよそ1秒程度)
最小圧縮単位であるblockの処理は、各block毎に独立していますので、
圧縮処理は504行目、展開処理は819行目のforを並列化すれば高速化出来ます。
(例えば当該のループに#pragma omp parallel forを記述します)
何卒宜しくお願い致します。
黒川