31
33
using System.Collections.Generic;
33
35
using System.Runtime.InteropServices;
36
using MonoMac.CoreFoundation;
35
37
using MonoMac.AudioToolbox;
37
39
namespace MonoMac.AudioUnit
41
public enum ExtAudioFileError
44
CodecUnavailableInputConsumed = -66559,
45
CodecUnavailableInputNotConsumed = -66560,
46
InvalidProperty = -66561,
47
InvalidPropertySize = -66562,
48
NonPCMClientFormat = -66563,
49
InvalidChannelMap = -66564,
50
InvalidOperationOrder = -66565,
51
InvalidDataFormat = -66566,
52
MaxPacketSizeUnknown = -66567,
54
AsyncWriteTooLarge = -66569,
55
AsyncWriteBufferOverflow = -66570,
61
FileNotFoundError = -43
39
64
public class ExtAudioFile : IDisposable
42
const int kAudioUnitSampleFractionBits = 24;
43
readonly IntPtr _extAudioFile;
47
public long FileLengthFrames
51
uint size = (uint)Marshal.SizeOf(typeof(long));
68
public uint? ClientMaxPacketSize {
70
uint size = sizeof (uint);
72
if (ExtAudioFileGetProperty (_extAudioFile, PropertyIDType.ClientMaxPacketSize, ref size, out value) != ExtAudioFileError.OK)
79
public uint? FileMaxPacketSize {
81
uint size = sizeof (uint);
84
if (ExtAudioFileGetProperty (_extAudioFile, PropertyIDType.FileMaxPacketSize, ref size, out value) != ExtAudioFileError.OK)
92
public IntPtr? AudioFile {
94
uint size = (uint) Marshal.SizeOf (typeof (IntPtr));
96
if (ExtAudioFileGetProperty (_extAudioFile, PropertyIDType.AudioFile, ref size, out value) != ExtAudioFileError.OK)
103
public AudioConverter AudioConverter {
105
uint size = sizeof (uint);
108
if (ExtAudioFileGetProperty (_extAudioFile, PropertyIDType.AudioConverter, ref size, out value) != ExtAudioFileError.OK)
111
return new AudioConverter (value, false);
115
public long FileLengthFrames {
118
uint size = sizeof (long);
53
int err = ExtAudioFileGetProperty(_extAudioFile,
54
ExtAudioFilePropertyIDType.kExtAudioFileProperty_FileLengthFrames,
55
ref size, ref length);
120
var err = ExtAudioFileGetProperty(_extAudioFile, PropertyIDType.FileLengthFrames, ref size, out length);
58
123
throw new InvalidOperationException(String.Format("Error code:{0}", err));
178
268
return numberFrames;
271
public uint Read (uint numberFrames, AudioBuffers audioBufferList, out ExtAudioFileError status)
273
if (audioBufferList == null)
274
throw new ArgumentNullException ("audioBufferList");
276
status = ExtAudioFileRead (_extAudioFile, ref numberFrames, (IntPtr) audioBufferList);
280
[Obsolete ("Use overload with AudioBuffers")]
180
281
public void WriteAsync(int numberFrames, AudioBufferList data)
182
283
int err = ExtAudioFileWriteAsync(_extAudioFile, numberFrames, data);
184
throw new ArgumentException(String.Format("Error code:{0}", err));
188
#region IDisposable メンバ
189
public void Dispose()
191
ExtAudioFileDispose(_extAudioFile);
286
throw new ArgumentException(String.Format("Error code:{0}", err));
290
public ExtAudioFileError WriteAsync (uint numberFrames, AudioBuffers audioBufferList)
292
if (audioBufferList == null)
293
throw new ArgumentNullException ("audioBufferList");
295
return ExtAudioFileWriteAsync (_extAudioFile, numberFrames, (IntPtr) audioBufferList);
298
public ExtAudioFileError Write (uint numberFrames, AudioBuffers audioBufferList)
300
if (audioBufferList == null)
301
throw new ArgumentNullException ("audioBufferList");
303
return ExtAudioFileWrite (_extAudioFile, numberFrames, (IntPtr) audioBufferList);
306
public ExtAudioFileError SynchronizeAudioConverter ()
308
IntPtr value = IntPtr.Zero;
309
return ExtAudioFileSetProperty (_extAudioFile, PropertyIDType.ConverterConfig,
310
Marshal.SizeOf (value), value);
313
public void Dispose ()
316
GC.SuppressFinalize (this);
319
protected virtual void Dispose (bool disposing)
321
if (_extAudioFile != IntPtr.Zero){
322
ExtAudioFileDispose (_extAudioFile);
323
_extAudioFile = IntPtr.Zero;
197
328
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "ExtAudioFileOpenURL")]
198
static extern int ExtAudioFileOpenUrl(IntPtr inUrl, IntPtr outExtAudioFile); // caution
329
static extern ExtAudioFileError ExtAudioFileOpenUrl(IntPtr inUrl, IntPtr outExtAudioFile); // caution
331
[DllImport (MonoMac.Constants.AudioToolboxLibrary)]
332
static extern ExtAudioFileError ExtAudioFileWrapAudioFileID (IntPtr inFileID, bool inForWriting, IntPtr outExtAudioFile);
200
335
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "ExtAudioFileRead")]
201
336
static extern int ExtAudioFileRead(IntPtr inExtAudioFile, ref int ioNumberFrames, AudioBufferList ioData);
338
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
339
static extern ExtAudioFileError ExtAudioFileRead (IntPtr inExtAudioFile, ref uint ioNumberFrames, IntPtr ioData);
341
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
342
static extern ExtAudioFileError ExtAudioFileWrite (IntPtr inExtAudioFile, uint inNumberFrames, IntPtr ioData);
203
345
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "ExtAudioFileWriteAsync")]
204
346
static extern int ExtAudioFileWriteAsync(IntPtr inExtAudioFile, int inNumberFrames, AudioBufferList ioData);
348
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
349
static extern ExtAudioFileError ExtAudioFileWriteAsync(IntPtr inExtAudioFile, uint inNumberFrames, IntPtr ioData);
206
351
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "ExtAudioFileDispose")]
207
352
static extern int ExtAudioFileDispose(IntPtr inExtAudioFile);
223
368
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "ExtAudioFileGetProperty")]
224
369
static extern int ExtAudioFileGetProperty(
225
370
IntPtr inExtAudioFile,
226
ExtAudioFilePropertyIDType inPropertyID,
227
ref uint ioPropertyDataSize,
228
IntPtr outPropertyData);
230
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "ExtAudioFileGetProperty")]
231
static extern int ExtAudioFileGetProperty(
232
IntPtr inExtAudioFile,
233
ExtAudioFilePropertyIDType inPropertyID,
234
ref uint ioPropertyDataSize,
235
ref AudioStreamBasicDescription outPropertyData);
238
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "ExtAudioFileGetProperty")]
239
static extern int ExtAudioFileGetProperty(
240
IntPtr inExtAudioFile,
241
ExtAudioFilePropertyIDType inPropertyID,
242
ref uint ioPropertyDataSize,
243
ref long outPropertyData);
245
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "ExtAudioFileSetProperty")]
246
static extern int ExtAudioFileSetProperty(
247
IntPtr inExtAudioFile,
248
ExtAudioFilePropertyIDType inPropertyID,
249
uint ioPropertyDataSize,
250
IntPtr outPropertyData);
252
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "ExtAudioFileSetProperty")]
253
static extern int ExtAudioFileSetProperty(
254
IntPtr inExtAudioFile,
255
ExtAudioFilePropertyIDType inPropertyID,
256
uint ioPropertyDataSize,
257
ref AudioStreamBasicDescription outPropertyData);
259
enum ExtAudioFilePropertyIDType {
260
kExtAudioFileProperty_FileDataFormat = 0x66666d74, //'ffmt', // AudioStreamBasicDescription
371
PropertyIDType inPropertyID,
372
ref uint ioPropertyDataSize,
373
IntPtr outPropertyData);
375
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "ExtAudioFileGetProperty")]
376
static extern int ExtAudioFileGetProperty(
377
IntPtr inExtAudioFile,
378
PropertyIDType inPropertyID,
379
ref uint ioPropertyDataSize,
380
ref AudioStreamBasicDescription outPropertyData);
382
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
383
static extern ExtAudioFileError ExtAudioFileGetProperty (IntPtr inExtAudioFile, PropertyIDType inPropertyID, ref uint ioPropertyDataSize, out IntPtr outPropertyData);
385
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
386
static extern ExtAudioFileError ExtAudioFileGetProperty (IntPtr inExtAudioFile, PropertyIDType inPropertyID, ref uint ioPropertyDataSize, out long outPropertyData);
388
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
389
static extern ExtAudioFileError ExtAudioFileGetProperty (IntPtr inExtAudioFile, PropertyIDType inPropertyID, ref uint ioPropertyDataSize, out uint outPropertyData);
391
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
392
static extern ExtAudioFileError ExtAudioFileSetProperty (IntPtr inExtAudioFile, PropertyIDType inPropertyID, int ioPropertyDataSize, IntPtr outPropertyData);
394
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "ExtAudioFileSetProperty")]
395
static extern int ExtAudioFileSetProperty(
396
IntPtr inExtAudioFile,
397
PropertyIDType inPropertyID,
398
uint ioPropertyDataSize,
399
ref AudioStreamBasicDescription outPropertyData);
401
enum PropertyIDType {
402
FileDataFormat = 0x66666d74, // 'ffmt'
261
403
//kExtAudioFileProperty_FileChannelLayout = 'fclo', // AudioChannelLayout
263
kExtAudioFileProperty_ClientDataFormat = 0x63666d74, //'cfmt', // AudioStreamBasicDescription
405
ClientDataFormat = 0x63666d74, //'cfmt', // AudioStreamBasicDescription
264
406
//kExtAudioFileProperty_ClientChannelLayout = 'cclo', // AudioChannelLayout
265
//kExtAudioFileProperty_CodecManufacturer = 'cman', // UInt32
407
CodecManufacturer = 0x636d616e, // 'cman'
268
//kExtAudioFileProperty_AudioConverter = 'acnv', // AudioConverterRef
269
//kExtAudioFileProperty_AudioFile = 'afil', // AudioFileID
270
//kExtAudioFileProperty_FileMaxPacketSize = 'fmps', // UInt32
271
//kExtAudioFileProperty_ClientMaxPacketSize = 'cmps', // UInt32
272
kExtAudioFileProperty_FileLengthFrames = 0x2366726d,//'#frm', // SInt64
410
AudioConverter = 0x61636e76, // 'acnv'
411
AudioFile = 0x6166696c, // 'afil'
412
FileMaxPacketSize = 0x666d7073, // 'fmps'
413
ClientMaxPacketSize = 0x636d7073, // 'cmps'
414
FileLengthFrames = 0x2366726d, // '#frm'
275
//kExtAudioFileProperty_ConverterConfig = 'accf', // CFPropertyListRef
417
ConverterConfig = 0x61636366, // 'accf'
276
418
//kExtAudioFileProperty_IOBufferSizeBytes = 'iobs', // UInt32
277
419
//kExtAudioFileProperty_IOBuffer = 'iobf', // void *
278
420
//kExtAudioFileProperty_PacketTable = 'xpti' // AudioFilePacketTableInfo