135
public enum AudioFileChunkType : uint
137
CAFStreamDescription = 0x64657363, // 'desc'
138
CAFAudioData = 0x64617461, // 'data'
139
CAFChannelLayout = 0x6368616e, // 'chan'
140
CAFFiller = 0x66726565, // 'free'
141
CAFMarker = 0x6d61726b, // 'mark'
142
CAFRegion = 0x7265676e, // 'regn'
143
CAFInstrument = 0x696e7374, // 'inst'
144
CAFMagicCookieID = 0x6b756b69, // 'kuki'
145
CAFInfoStrings = 0x696e666f, // 'info'
146
CAFEditComments = 0x65646374, // 'edct'
147
CAFPacketTable = 0x70616b74, // 'pakt'
148
CAFStrings = 0x73747267, // 'strg'
149
CAFUUID = 0x75756964, // 'uuid'
150
CAFPeak = 0x7065616b, // 'peak'
151
CAFOverview = 0x6f767677, // 'ovvw'
152
CAFMIDI = 0x6d696469, // 'midi'
153
CAFUMID = 0x756d6964, // 'umid'
154
CAFFormatListID = 0x6c647363, // 'ldsc'
155
CAFiXML = 0x69584d4c, // 'iXML'
132
158
[StructLayout(LayoutKind.Sequential)]
133
159
struct AudioFramePacketTranslation {
134
160
public long Frame;
174
[StructLayout(LayoutKind.Sequential)]
175
struct AudioFileMarkerList {
176
public uint SmpteTimeType;
177
public uint NumberMarkers;
178
public AudioFileMarker Markers; // this is a variable length array of mNumberMarkers elements
180
public static int RecordsThatFitIn (int n)
183
if (n <= sizeof (AudioFileMarker))
186
return n / sizeof (AudioFileMarker);
190
public static int SizeForMarkers (int markers)
193
return 8 + markers * sizeof (AudioFileMarker);
198
[StructLayout(LayoutKind.Sequential)]
199
struct AudioFileRegion {
200
public uint RegionID;
201
public IntPtr Name_cfstringref;
204
public AudioFileMarker Markers; // this is a variable length array of mNumberMarkers elements
207
[StructLayout(LayoutKind.Sequential)]
208
struct AudioFileRegionList {
209
public uint SmpteTimeType;
211
public AudioFileRegion Regions; // this is a variable length array of mNumberRegions elements
206
public enum AudioFileMarkerType : uint
210
CAFProgramStart = 0x70626567, // 'pbeg'
211
CAFProgramEnd = 0x70656e64, // 'pend'
212
CAFTrackStart = 0x74626567, // 'tbeg'
213
CAFTrackEnd = 0x74656e54, // 'tend'
214
CAFIndex = 0x696e6478, // 'indx'
215
CAFRegionStart = 0x72626567, // 'rbeg'
216
CAFRegionEnd = 0x72626567, // 'rend'
217
CAFRegionSyncPoint = 0x72737963, // 'rsyc'
218
CAFSelectionStart = 0x73626567, // 'sbeg'
219
CAFSelectionEnd = 0x73626567, // 'send'
220
CAFEditSourceBegin = 0x63626567, // 'cbeg'
221
CAFEditSourceEnd = 0x63626567, // 'cend'
222
CAFEditDestinationBegin = 0x64626567, // 'dbeg'
223
CAFEditDestinationEnd = 0x64626567, // 'dend'
224
CAFSustainLoopStart = 0x736c6267, // 'slbg'
225
CAFSustainLoopEnd = 0x736c6265, // 'slen'
226
CAFReleaseLoopStart = 0x726c6267, // 'rlbg'
227
CAFReleaseLoopEnd = 0x726c6265, // 'rlen'
228
CAFSavedPlayPosition = 0x73706c79, // 'sply'
229
CAFTempo = 0x746d706f, // 'tmpo'
230
CAFTimeSignature = 0x74736967, // 'tsig'
231
CAFKeySignature = 0x6b736967, // 'ksig'
234
public class AudioFileMarkerList : IDisposable
239
public AudioFileMarkerList (IntPtr ptr, bool owns)
245
~AudioFileMarkerList ()
248
GC.SuppressFinalize (this);
251
public SmpteTimeType SmpteTimeType {
253
return (SmpteTimeType) Marshal.ReadInt32 (ptr);
259
return (uint) Marshal.ReadInt32 (ptr, 4);
263
public AudioFileMarker this [int index] {
265
if (index >= Count || index < 0)
266
throw new ArgumentOutOfRangeException ("index");
271
// struct AudioFileMarkerList
273
// UInt32 mSMPTE_TimeType;
274
// UInt32 mNumberMarkers;
275
// AudioFileMarker mMarkers[1]; // this is a variable length array of mNumberMarkers elements
279
var ptr = (AudioFileMarker *) this.ptr + 2 * sizeof (int) + index * sizeof (AudioFileMarker);
285
public void Dispose ()
290
protected virtual void Dispose (bool disposing)
292
if (!owns || ptr == IntPtr.Zero)
295
for (int i = 0; i < Count; ++i) {
296
CFObject.CFRelease (this [i].Name_cfstringref);
299
Marshal.FreeHGlobal (ptr);
304
[StructLayout(LayoutKind.Sequential)]
305
public struct AudioFilePacketTableInfo
307
public long ValidFrames;
308
public int PrimingFrames;
309
public int RemainderFrames;
312
[StructLayout(LayoutKind.Sequential)]
313
public struct AudioFileRegion {
318
// struct AudioFileRegion
321
// CFStringRef mName;
323
// UInt32 mNumberMarkers;
324
// AudioFileMarker mMarkers[1]; // this is a variable length array of mNumberMarkers elements
327
public AudioFileRegion (IntPtr ptr)
332
public uint RegionID {
334
return (uint) Marshal.ReadInt32 (ptr);
340
return CFString.FetchString (NameWeak);
344
internal IntPtr NameWeak {
346
return Marshal.ReadIntPtr (ptr, sizeof (uint));
350
public unsafe AudioFileRegionFlags Flags {
352
return (AudioFileRegionFlags) Marshal.ReadInt32 (ptr, sizeof (uint) + sizeof (IntPtr));
356
public unsafe int Count {
358
return Marshal.ReadInt32 (ptr, 2 * sizeof (uint) + sizeof (IntPtr));
362
public AudioFileMarker this [int index] {
364
if (index >= Count || index < 0)
365
throw new ArgumentOutOfRangeException ("index");
368
var ptr = (AudioFileMarker *) this.ptr + 3 * sizeof (int) + sizeof (IntPtr) + index * sizeof (AudioFileMarker);
374
internal unsafe int TotalSize {
376
return Count * sizeof (AudioFileMarker);
382
public enum AudioFileRegionFlags : uint
389
public class AudioFileRegionList : IDisposable
394
public AudioFileRegionList (IntPtr ptr, bool owns)
400
~AudioFileRegionList ()
403
GC.SuppressFinalize (this);
406
public SmpteTimeType SmpteTimeType {
408
return (SmpteTimeType) Marshal.ReadInt32 (ptr);
414
return (uint) Marshal.ReadInt32 (ptr, sizeof (uint));
418
public AudioFileRegion this [int index] {
420
if (index >= Count || index < 0)
421
throw new ArgumentOutOfRangeException ("index");
426
// struct AudioFileRegionList
428
// UInt32 mSMPTE_TimeType;
429
// UInt32 mNumberRegions;
430
// AudioFileRegion mRegions[1]; // this is a variable length array of mNumberRegions elements
434
var ptr = (byte *) this.ptr + 2 * sizeof (uint);
435
for (int i = 0; i < index; ++i) {
436
var region = new AudioFileRegion ((IntPtr) ptr);
437
ptr += region.TotalSize;
440
return new AudioFileRegion ((IntPtr) ptr);
445
public void Dispose ()
450
protected virtual void Dispose (bool disposing)
452
if (!owns || ptr == IntPtr.Zero)
455
for (int i = 0; i < Count; ++i) {
456
CFObject.CFRelease (this [i].NameWeak);
459
Marshal.FreeHGlobal (ptr);
214
464
public class AudioFile : IDisposable {
296
546
[DllImport (Constants.AudioToolboxLibrary)]
297
547
extern static OSStatus AudioFileOpenURL (IntPtr cfurlref_infile, byte permissions, AudioFileType fileTypeHint, out IntPtr file_id);
299
public static AudioFile OpenRead (string url, AudioFileType fileTypeHint)
549
public static AudioFile OpenRead (string url, AudioFileType fileTypeHint = 0)
301
551
return Open (url, AudioFilePermission.Read, fileTypeHint);
304
public static AudioFile OpenRead (CFUrl url, AudioFileType fileTypeHint)
554
public static AudioFile OpenRead (CFUrl url, AudioFileType fileTypeHint = 0)
306
556
return Open (url, AudioFilePermission.Read, fileTypeHint);
309
public static AudioFile OpenRead (NSUrl url, AudioFileType fileTypeHint)
559
public static AudioFile OpenRead (NSUrl url, AudioFileType fileTypeHint = 0)
311
561
return Open (url, AudioFilePermission.Read, fileTypeHint);
314
public static AudioFile Open (string url, AudioFilePermission permissions, AudioFileType fileTypeHint)
564
public static AudioFile Open (string url, AudioFilePermission permissions, AudioFileType fileTypeHint = 0)
317
567
throw new ArgumentNullException ("url");
443
693
return ReadPacketData (useCache, inStartingPacket, ref nPackets, buffer, offset, ref count);
696
[DllImport (Constants.AudioToolboxLibrary)]
697
extern static AudioFileError AudioFileReadPackets (IntPtr inAudioFile, bool inUseCache, out int numBytes,
698
[MarshalAs (UnmanagedType.LPArray)] AudioStreamPacketDescription[] packetDescriptions, long startingPacket, ref int numPackets, IntPtr buffer);
700
public AudioFileError ReadPackets (bool useCache, out int numBytes,
701
AudioStreamPacketDescription[] packetDescriptions, long startingPacket, ref int numPackets, IntPtr buffer)
703
if (buffer == IntPtr.Zero)
704
throw new ArgumentException ("buffer");
706
return AudioFileReadPackets (handle, useCache, out numBytes, packetDescriptions, startingPacket, ref numPackets, buffer);
446
709
static internal AudioStreamPacketDescription [] PacketDescriptionFrom (int nPackets, IntPtr b)
448
711
if (b == IntPtr.Zero)
550
813
[DllImport (Constants.AudioToolboxLibrary)]
551
extern static OSStatus AudioFileWritePackets (
814
extern static AudioFileError AudioFileWritePackets (
552
815
AudioFileID audioFile, bool useCache, int inNumBytes, AudioStreamPacketDescription [] inPacketDescriptions,
553
816
long inStartingPacket, ref int numPackets, IntPtr buffer);
555
public int WritePackets (bool useCache, long inStartingPacket, int numPackets, IntPtr buffer, int count)
818
public int WritePackets (bool useCache, long startingPacket, int numPackets, IntPtr buffer, int count)
557
820
if (buffer == IntPtr.Zero)
558
821
throw new ArgumentNullException ("buffer");
560
if (AudioFileWritePackets (handle, useCache, count, null, inStartingPacket, ref numPackets, buffer) == 0)
823
if (AudioFileWritePackets (handle, useCache, count, null, startingPacket, ref numPackets, buffer) == 0)
561
824
return numPackets;
566
unsafe public int WritePackets (bool useCache, long inStartingPacket, AudioStreamPacketDescription [] inPacketDescriptions, IntPtr buffer, int count)
829
public int WritePackets (bool useCache, long startingPacket, AudioStreamPacketDescription [] packetDescriptions, IntPtr buffer, int count)
568
if (inPacketDescriptions == null)
569
throw new ArgumentNullException ("inPacketDescriptions");
831
if (packetDescriptions == null)
832
throw new ArgumentNullException ("packetDescriptions");
570
833
if (buffer == IntPtr.Zero)
571
834
throw new ArgumentNullException ("buffer");
572
int nPackets = inPacketDescriptions.Length;
573
if (AudioFileWritePackets (handle, useCache, count, inPacketDescriptions, inStartingPacket, ref nPackets, buffer) == 0)
835
int nPackets = packetDescriptions.Length;
836
if (AudioFileWritePackets (handle, useCache, count, packetDescriptions, startingPacket, ref nPackets, buffer) == 0)
599
unsafe public int WritePackets (bool useCache, long inStartingPacket, AudioStreamPacketDescription [] inPacketDescriptions, IntPtr buffer, int count, out int errorCode)
862
public int WritePackets (bool useCache, long startingPacket, AudioStreamPacketDescription [] packetDescriptions, IntPtr buffer, int count, out int errorCode)
601
if (inPacketDescriptions == null)
602
throw new ArgumentNullException ("inPacketDescriptions");
864
if (packetDescriptions == null)
865
throw new ArgumentNullException ("packetDescriptions");
603
866
if (buffer == IntPtr.Zero)
604
throw new ArgumentNullException ("buffer");
605
int nPackets = inPacketDescriptions.Length;
867
throw new ArgumentException ("buffer");
868
int nPackets = packetDescriptions.Length;
607
errorCode = AudioFileWritePackets (handle, useCache, count, inPacketDescriptions, inStartingPacket, ref nPackets, buffer);
870
errorCode = (int) AudioFileWritePackets (handle, useCache, count, packetDescriptions, startingPacket, ref nPackets, buffer);
608
871
if (errorCode == 0)
626
889
int nPackets = packetDescriptions.Length;
627
890
fixed (byte *bop = &buffer [offset]){
628
errorCode = AudioFileWritePackets (handle, useCache, count, packetDescriptions, startingPacket, ref nPackets, (IntPtr) bop);
891
errorCode = (int) AudioFileWritePackets (handle, useCache, count, packetDescriptions, startingPacket, ref nPackets, (IntPtr) bop);
629
892
if (errorCode == 0)
898
public AudioFileError WritePackets (bool useCache, int numBytes, AudioStreamPacketDescription[] packetDescriptions, long startingPacket, ref int numPackets, IntPtr buffer)
900
if (buffer == IntPtr.Zero)
901
throw new ArgumentException ("buffer");
903
return AudioFileWritePackets (handle, useCache, numBytes, packetDescriptions, startingPacket, ref numPackets, buffer);
635
906
[DllImport (Constants.AudioToolboxLibrary)]
636
907
extern static OSStatus AudioFileCountUserData (AudioFileID handle, uint userData, out int count);
1221
public double ReserveDuration {
1223
return GetDouble (AudioFileProperty.ReserveDuration);
1227
public AudioFileMarkerList MarkerList {
1231
var res = GetPropertyInfo (AudioFileProperty.MarkerList, out size, out writable);
1235
IntPtr ptr = Marshal.AllocHGlobal (size);
1236
if (AudioFileGetProperty (handle, AudioFileProperty.MarkerList, ref size, (IntPtr) ptr) != 0) {
1237
Marshal.FreeHGlobal (ptr);
1241
return new AudioFileMarkerList (ptr, true);
1245
public AudioFileRegionList RegionList {
1249
var res = GetPropertyInfo (AudioFileProperty.RegionList, out size, out writable);
1253
IntPtr ptr = Marshal.AllocHGlobal (size);
1254
if (AudioFileGetProperty (handle, AudioFileProperty.RegionList, ref size, (IntPtr) ptr) != 0) {
1255
Marshal.FreeHGlobal (ptr);
1259
return new AudioFileRegionList (ptr, true);
1263
public unsafe AudioFilePacketTableInfo? PacketTableInfo {
1265
return GetProperty<AudioFilePacketTableInfo> (AudioFileProperty.PacketTableInfo);
1269
throw new ArgumentNullException ("value");
1271
AudioFilePacketTableInfo afpti = value.Value;
1272
var res = AudioFileSetProperty (handle, AudioFileProperty.PacketTableInfo, sizeof (AudioFilePacketTableInfo), ref afpti);
1274
throw new ArgumentException (res.ToString ());
1278
public unsafe AudioFileChunkType[] ChunkIDs {
1282
var res = GetPropertyInfo (AudioFileProperty.ChunkIDs, out size, out writable);
1286
var data = new AudioFileChunkType[size / sizeof (AudioFileChunkType)];
1287
fixed (AudioFileChunkType* ptr = data) {
1288
if (AudioFileGetProperty (handle, AudioFileProperty.ChunkIDs, ref size, (IntPtr) ptr) != 0)
1296
public unsafe byte[] ID3Tag {
1300
var res = GetPropertyInfo (AudioFileProperty.ID3Tag, out size, out writable);
1304
var data = new byte[size];
1305
fixed (byte* ptr = data) {
1306
if (AudioFileGetProperty (handle, AudioFileProperty.ID3Tag, ref size, (IntPtr) ptr) != 0)
1314
public AudioFileInfoDictionary InfoDictionary {
1316
var ptr = GetIntPtr (AudioFileProperty.InfoDictionary);
1317
if (ptr == IntPtr.Zero)
1320
return new AudioFileInfoDictionary(new NSMutableDictionary (ptr, true));
926
1324
public long PacketToFrame (long packet)
928
1326
AudioFramePacketTranslation buffer;
993
// MarkerList = 0x6d6b6c73,
994
// RegionList = 0x72676c73,
995
// ChunkIDs = 0x63686964,
996
// InfoDictionary = 0x696e666f,
997
// PacketTableInfo = 0x706e666f,
998
// FormatList = 0x666c7374,
999
// ReserveDuration = 0x72737276,
1000
// EstimatedDuration = 0x65647572,
1001
// ID3Tag = 0x69643374,
1392
public class AudioFileInfoDictionary : DictionaryContainer
1394
internal AudioFileInfoDictionary (NSDictionary dict)
1399
public string Album {
1401
return GetStringValue ("album");
1405
public string ApproximateDurationInSeconds {
1407
return GetStringValue ("approximate duration in seconds");
1411
public string Artist {
1413
return GetStringValue ("artist");
1417
public string ChannelLayout {
1419
return GetStringValue ("channel layout");
1423
public string Composer {
1425
return GetStringValue ("composer");
1429
public string Comments {
1431
return GetStringValue ("comments");
1435
public string Copyright {
1437
return GetStringValue ("copyright");
1441
public string EncodingApplication {
1443
return GetStringValue ("encoding application");
1447
public string Genre {
1449
return GetStringValue ("genre");
1453
public string ISRC {
1455
return GetStringValue ("ISRC");
1459
public string KeySignature {
1461
return GetStringValue ("key signature");
1465
public string Lyricist {
1467
return GetStringValue ("lyricist");
1471
public string NominalBitRate {
1473
return GetStringValue ("nominal bit rate");
1477
public string RecordedDate {
1479
return GetStringValue ("recorded date");
1483
public string SourceBitDepth {
1485
return GetStringValue ("source bit depth");
1489
public string SourceEncoder {
1491
return GetStringValue ("source encoder");
1495
public string SubTitle {
1497
return GetStringValue ("subtitle");
1501
public string Tempo {
1503
return GetStringValue ("tempo");
1507
public string TimeSignature {
1509
return GetStringValue ("time signature");
1513
public string Title {
1515
return GetStringValue ("title");
1519
public string TrackNumber {
1521
return GetStringValue ("track number");
1525
public string Year {
1527
return GetStringValue ("year");
1005
1532
delegate int ReadProc (IntPtr clientData, long position, int requestCount, IntPtr buffer, out int actualCount);