Buffer_Data.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. namespace OpenVIII.AV
  2. {
  3. using FFmpeg.AutoGen;
  4. using System;
  5. using System.IO;
  6. /// <summary>
  7. /// Used only when reading ADPCM data from memory.
  8. /// </summary>
  9. public struct BufferData
  10. {
  11. #region Fields
  12. public UInt32 DataSeekLoc;
  13. public UInt32 DataSize;
  14. private IntPtr Header;
  15. public UInt32 HeaderSize;
  16. #endregion Fields
  17. #region Methods
  18. public unsafe int Read(byte* buf, int buf_size)
  19. {
  20. int ret;
  21. if ((ret = ReadHeader(buf, buf_size)) != ffmpeg.AVERROR_EOF)
  22. return ret;
  23. else
  24. return ReadData(buf, buf_size);
  25. }
  26. public void SetHeader(IntPtr value) => Header = value;
  27. public unsafe void SetHeader(byte* value) => Header = (IntPtr)value;
  28. public static string DataFileName { get; private set; }
  29. private unsafe int ReadData(byte* buf, int buf_size)
  30. {
  31. if (string.IsNullOrWhiteSpace(DataFileName))
  32. DataFileName = Path.Combine(Memory.FF8DIRdata, "Sound", "audio.dat");
  33. buf_size = Math.Min(buf_size, (int)DataSize);
  34. if (buf_size == 0)
  35. {
  36. return ffmpeg.AVERROR_EOF;
  37. }
  38. FileStream fs = null;
  39. // binaryReader disposes of fs
  40. using (BinaryReader br = new BinaryReader(fs = File.Open(DataFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
  41. {
  42. fs.Seek(DataSeekLoc, SeekOrigin.Begin);
  43. using (UnmanagedMemoryStream ums = new UnmanagedMemoryStream(buf, buf_size, buf_size, FileAccess.Write))
  44. {
  45. // copy public buffer data to buf
  46. ums.Write(br.ReadBytes(buf_size), 0, buf_size);
  47. DataSeekLoc += (uint)buf_size;
  48. DataSize -= (uint)buf_size;
  49. fs = null;
  50. return buf_size;
  51. }
  52. }
  53. }
  54. private unsafe int ReadHeader(byte* buf, int buf_size)
  55. {
  56. buf_size = Math.Min(buf_size, (int)HeaderSize);
  57. if (buf_size == 0)
  58. {
  59. return ffmpeg.AVERROR_EOF;
  60. }
  61. // copy public buffer data to buf
  62. Buffer.MemoryCopy((void*)Header, (void*)buf, buf_size, buf_size);
  63. Header += buf_size;
  64. HeaderSize -= (uint)buf_size;
  65. return buf_size;
  66. }
  67. #endregion Methods
  68. //can't do this because soon as fixed block ends the pointer is no good.
  69. //private void SetHeader(byte[] value)
  70. //{
  71. // fixed (byte* tmp = &value[0])
  72. // {
  73. // Header = (IntPtr)tmp;
  74. // }
  75. //}
  76. //< size left in the buffer
  77. };
  78. }