Я пытаюсь сообщить об ошибке в декодере MP3, и разработчик попросил меня сгенерировать файл PCM для него, чтобы определить проблему.
Итак, это код, который я использовал для создания файла PCM
private async Task NewMethod()
{
var file = await SelectPlaybackFile();
await Task.Run(() =>
{
_handle = Bass.BASS_StreamCreateFile(file.Path, 0,0,BASSFlag.BASS_STREAM_AUTOFREE | BASSFlag.BASS_SAMPLE_FLOAT);
var _myDSPProc = new DSPPROC(Dsp1);
int dspHandle = Bass.BASS_ChannelSetDSP(_handle, _myDSPProc, IntPtr.Zero, 0);
Bass.BASS_ChannelPlay(_handle, false);
});
}
unsafe void Dsp1(int handle, int channel, IntPtr buffer, int length, IntPtr user)
{
}
Я заметил, что буфер - это неуправляемая память, и я никогда не имел дело с этим раньше. Поэтому я начал проводить исследования и нашел ответ здесь , и это код из этого ответа
private void callback(IntPtr buffer, int length)
{
FileStream file = new FileStream(filename, FileMode.Create, FileAccess.Write);
int written;
WriteFile(file.Handle, buffer, length, out written, IntPtr.Zero);
file.Close();
}
[DllImport("kernel32.dll")]
private static extern bool WriteFile(IntPtr hFile, IntPtr lpBuffer, int NumberOfBytesToWrite, out int lpNumberOfBytesWritten, IntPtr lpOverlapped);
Однако приведенный выше код может не работать в UWP, поскольку приложение работает в «песочнице» и dev не может получить доступ к пути.
Есть ли другой способ помочь записать IntPtr в файл в UWP?