4

Audio objects backed by in-memory data (not files) seem to contain a RawArray.

Is there a way to get the AudioData as an appropriate-type RawArray?


It could be done by forcing a change of representation, such as passing through MathLink, Uncompress[Compress[...], Hold], or similar. None of these is fast.

It could be done by just using AudioData and re-packing the result into a RawArray. This wasted memory. The typical audio representation uses 16-bit integers. Converting this to 64-bit integers or reals increases the storage requirements by a factor of 4.


Motivation:

Currently, there is no direct way to exchange Audio objects with C code through LibraryLink, but there is a way to send/receive RawArrays.

This is not a problem for the similar Image/Image3D (also likely backed by RawArray) because that is directly supported by LibraryLink (MImage).

RawArrays can be converted to Audio using Audio[ra, ...].

Szabolcs
  • 234,956
  • 30
  • 623
  • 1,263

1 Answers1

3

The internal function Audio`InternalAudioData could be used to accomplish this, subject to the usual caveats concerning undocumented functionality.

Audio`InternalAudioData[Audio[{1, 2, 3, 4}]]

(* RawArray["Real32", <1, 4>] *)

Audio`InternalAudioData[Audio["ExampleData/car.mp3"]]

(* RawArray["Real32", <1, 328320>] *)
ilian
  • 25,474
  • 4
  • 117
  • 186