SRS Labs, Inc. was a Santa Ana, California-based audio technology engineering company that specialized in audio enhancement solutions for wide variety of consumer electronic devices. Originally a part of Hughes Aircraft Company,[when?] the audio division developed the Sound Retrieval System technology, and in 1993 was separated off to form SRS Labs, Inc. In 1996 SRS Labs became a publicly traded company on Nasdaq, SRSL.
The company developed audio enhancement solutions and licenses those products to companies including Microsoft, Samsung Group, LG Group, Toshiba, Vizio, Dell, Hewlett-Packard, Sony, ViewSonic, Sharp Corporation, Haier, and Hisense.[1]
SRS Labs had more than three hundred consumer electronics manufacturing partners, and more than 150 patents for its technologies.[3] SRS manufactured its own products, including, MyVolume - Volume Leveling Adaptor, SRS iWOW for iTunes, SRS Audio Sandbox for PC, and SRS iWOW Adaptor for iPod.
While developing an audio extension you may have ignored sandboxing for these targets. This is finefor development but when it comes to submitting the container application to the app store the container app andextension must have sandbox enabled.
If not you can create this file and check in XCode in the build settings for the target. Filter for entitlement andlook at the Code Signing Entitlements value. This should show the filepath XCode is expecting or if it's not there youcan set it to the file you created.
This Tech Note describes how Audio Components can convey their resource usage requirements to the system, and how the system makes use of this information to resolve the conflict between the resource usage requirements of the Audio Component and the resources a host application's Sandbox allows access to.
This is accomplished by the application voluntarily forgoing access to system resources such as the file system, network, communications with other processes or drivers and so forth. The application indicates what services it requires access to via entitlements that are attached to the application through its code signature. The system reads these entitlements from the code signature and Sandbox enforces the restrictions.
Audio Components are independent bundles of code which can perform tasks such as audio signal processing, encoding/decoding audio data, audio file parsing, and so forth. Applications load Audio Components into their process to take advantage of these abilities. An Audio Component, like any code, may require access to various system resources in order to do its job. This sets up the potential for conflict between the resources an Audio Component needs access to and the resources the host application's Sandbox allows access to.
In OS X 10.6, the Audio Unit Framework added the AudioComponent API for loading and manipulating Audio Components by host applications. The AudioComponent API supplants the usage of the Component Manager for these tasks. It is important to note that the AudioComponent API provides access to both Audio Component-style plug-ins as well as Component Manager plug-ins. As such, any application targeting 10.6 or later should switch to the AudioComponent API. The Component Manager is officially deprecated as of OS X Mountain Lion.
For applications targeting earlier systems, the recommended approach is to use the AudioComponent API when running on Mac OS X 10.6 or later and to conditionally fall back to the Component Manager when running on earlier systems.
Note: Audio Components can be built in such a way that the binary can be deployed as an Audio Component Plug-In on OS X 10.7 and later and as a Component Manager component on earlier systems. Please refer to Tech Note TN2276 for more information.
Important: Only Audio Component Plug-ins can declare themselves safe to open inside a sandboxed process. All Component Manager components are assumed to be unsafe to open in a sandboxed process.
A "Sandbox Safe Audio Component" is defined to be an Audio Component that can function correctly in a process that has the most severely restricting Sandbox, where access to all system resources such as the file system, network, drivers in the kernel and so on have been curtailed. Such an Audio Component will never cause sandbox violations to be noted in the console logs.
An Audio Component indicates to the system that it is Sandbox Safe by including the "sandboxSafe" key in its description dictionary located in the info.plist of the containing bundle. This key is reflected in the componentFlags field of the AudioComponentDescription for the Audio Component with the constant, kAudioComponentFlag_SandboxSafe.
Listing 1 shows an example of a description dictionary for a hypothetical AudioUnit called MyExampleAU. This AudioUnit does all of its work without requiring access to any system resources and is completely Sandbox Safe. Note how this is expressed using the "sandboxSafe" key.
Audio Components can also be registered with the system dynamically with the Audio Component API call, AudioComponentRegister(). The caller informs the system that such an Audio Component is Sandbox Safe by setting the flag, kAudioComponentFlag_SandboxSafe, in the AudioComponentDescription passed to AudioComponentRegister(). Listing 2 demonstrates dynamic registration using same information from MyExampleAU above.
The most common system service whose usage makes an Audio Component not be Sandbox Safe is the file system. As such, an Audio Component should make use of the system provided standard Open & Save dialogs to allow the user to locate necessary files as well as API services such as NSSearchPathForDirectoriesInDomains() to locate specific directories.
If an Audio Component does not meet the requirements to be Sandbox Safe, it must declare to the system the system resources that it requires access to. This is done using the description dictionary in the Info.plist of the containing bundle with the "resourceUsage" key.
The "iokit.user-client" key. This key describes the IOKit user client objects the Audio Component will open. It is an array of the user clients' class names that the Audio Component needs to open connections to.
The "mach-lookup.global-name" key. This key describes the Mach services the Audio Component needs to connect to. It is an array of the names of the services. Note that these services can be direct mach services found via bootstrap_look_up() or XPC services found via xpc_connection_create_mach_service().
The "temporary-exception.files.all.read-write" key. This key is a boolean that indicates that the Audio Component needs arbitrary access to the file system. This is for backward compatibility for Audio Components that have not yet adopted the usage of security-scope bookmarks and/or the usage of the standard file dialog for discovering, accessing and storing persistent references to files on the file system. In a future OS release, this key will not be supported.
Important: A dynamically registered Audio Component cannot declare its resource usage. It is either Sandbox Safe or not as indicated by the presence or absence of the kAudioComponentFlag_SandboxSafe component flag in the AudioComponentDescription passed to AudioComponentRegister().
There are several approaches a sandboxed application can take regarding loading Audio Components. The simplest method is for the application to only support loading Audio Components that are Sandbox Safe. This can be accomplished by setting the flag, kAudioComponentFlag_SandboxSafe, in the AudioComponentDescription passed to the AudioComponent API call, AudioComponentFindNext() when searching for Audio Components to load.
If an application wishes to open Audio Components that are not Sandbox Safe, the application must be signed with the entitlement "com.apple.security.temporary-exception.audio-unit-host". Any attempt to open an Audio Component that isn't Sandbox Safe by an application that does not have this entitlement will fail.
When an application with the "com.apple.security.temporary-exception.audio-unit-host" entitlement tries to open an Audio Component that isn't Sandbox Safe, the system will show the user a dialog indicating that the process is attempting to open an Audio Component that isn't Sandbox Safe.
If the user does not approve of the action, the open attempt will fail and the user will see the dialog again the next time the application tries to open an Audio Component that isn't Sandbox Safe. If the user approves of the action, the system will disable the host application's sandbox, the attempt to open the Audio Component will succeed and any further attempts to open an Audio Component that isn't Sandbox Safe will succeed without the user seeing the dialog. Also, the system will remember the user's response so that if the application tries to open the same Audio Component in the future, it will succeed without showing the dialog to the user.
Many applications build up a list of the various Audio Components and their capabilities. Since querying an Audio Component to find out what it does requires opening the Audio Component, this may cause the application's sandbox to drop even if the application never uses any of the queried Audio Components.
To avoid dropping the application's sandbox while querying components, the new AudioComponentCopyConfigurationInfo() API can be used. This call returns a dictionary containing information about the capabilities of the Audio Component. The keys returned in this dictionary depend on the kind of Audio Component. For Audio Codecs and Audio File Components, there are no defined keys. For Audio Units, the keys are defined in and include such things as whether the Audio Unit has a custom view (kAudioUnitConfigurationInfo_HasCustomView) and the channel configurations (kAudioUnitConfigurationInfo_ChannelConfigurations) the Audio unit may be configured for and so on.
Some Speech Synthesis Markup Language (SSML) examples in the documentation display in the audio sandbox. You can use this sandbox to listen to the audio generated by the SSML and experiment with SSML tags.
b1e95dc632