Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. Join us on Thursday, June 8, for a Q&A with Unity's Content Pipeline group here on the forum, and on the Unity Discord, and discuss topics around Content Build, Import Workflows, Asset Database, and Addressables!
    Dismiss Notice

Batch audio clip import settings modifier

Discussion in 'Scripting' started by Mat, Apr 15, 2010.

  1. Mat

    Mat

    Joined:
    Dec 4, 2009
    Posts:
    30
    Hello,

    I needed to modify the import settings of a S***load of audio clips in my project so I converted the nice editor script ChangeTextureImportSettings.cs (posted by Martin Schultz on the wiki) to work with audio clips and audio import settings. It adds a 'Sound' entry in the 'Custom' menu in the Unity editor and works exactly the same way.

    I don't have an account on the wiki and don't want to bother to create one at the moment so here is ChangeAudioImportSettings.cs (to copy in the Assets/Editor/ folder):
    Code (csharp):
    1.  
    2. using UnityEngine;
    3. using UnityEditor;
    4.  
    5. // /////////////////////////////////////////////////////////////////////////////////////////////////////////
    6. //
    7. // Batch audio import settings modifier.
    8. //
    9. // Modifies all selected audio clips in the project window and applies the requested modification on the
    10. // audio clips. Idea was to have the same choices for multiple files as you would have if you open the
    11. // import settings of a single audio clip. Put this into Assets/Editor and once compiled by Unity you find
    12. // the new functionality in Custom -> Sound. Enjoy! :-)
    13. //
    14. // April 2010. Based on Martin Schultz's texture import settings batch modifier.
    15. //
    16. // /////////////////////////////////////////////////////////////////////////////////////////////////////////
    17. public class ChangeAudioImportSettings : ScriptableObject {
    18.  
    19.     [MenuItem ("Custom/Sound/Toggle audio compression/Disable")]
    20.     static void ToggleCompression_Disable() {
    21.         SelectedToggleCompressionSettings(AudioImporterFormat.Native);
    22.     }
    23.  
    24.     [MenuItem ("Custom/Sound/Toggle audio compression/Enable")]
    25.     static void ToggleCompression_Enable() {
    26.         SelectedToggleCompressionSettings(AudioImporterFormat.Compressed);
    27.     }
    28.  
    29.     // ----------------------------------------------------------------------------
    30.  
    31.     [MenuItem ("Custom/Sound/Set audio compression bitrate (kbps)/32")]
    32.     static void SetCompressionBitrate_32kbps() {
    33.         SelectedSetCompressionBitrate(32000);
    34.     }
    35.  
    36.     [MenuItem ("Custom/Sound/Set audio compression bitrate (kbps)/64")]
    37.     static void SetCompressionBitrate_64kbps() {
    38.         SelectedSetCompressionBitrate(64000);
    39.     }
    40.  
    41.     [MenuItem ("Custom/Sound/Set audio compression bitrate (kbps)/96")]
    42.     static void SetCompressionBitrate_96kbps() {
    43.         SelectedSetCompressionBitrate(96000);
    44.     }
    45.  
    46.     [MenuItem ("Custom/Sound/Set audio compression bitrate (kbps)/128")]
    47.     static void SetCompressionBitrate_128kbps() {
    48.         SelectedSetCompressionBitrate(128000);
    49.     }
    50.  
    51.     [MenuItem ("Custom/Sound/Set audio compression bitrate (kbps)/144")]
    52.     static void SetCompressionBitrate_144kbps() {
    53.         SelectedSetCompressionBitrate(144000);
    54.     }
    55.  
    56.     [MenuItem ("Custom/Sound/Set audio compression bitrate (kbps)/156 (default)")]
    57.     static void SetCompressionBitrate_156kbps() {
    58.         SelectedSetCompressionBitrate(156000);
    59.     }
    60.  
    61.     [MenuItem ("Custom/Sound/Set audio compression bitrate (kbps)/160")]
    62.     static void SetCompressionBitrate_160kbps() {
    63.         SelectedSetCompressionBitrate(160000);
    64.     }
    65.  
    66.     [MenuItem ("Custom/Sound/Set audio compression bitrate (kbps)/192")]
    67.     static void SetCompressionBitrate_192kbps() {
    68.         SelectedSetCompressionBitrate(192000);
    69.     }
    70.  
    71.     [MenuItem ("Custom/Sound/Set audio compression bitrate (kbps)/224")]
    72.     static void SetCompressionBitrate_224kbps() {
    73.         SelectedSetCompressionBitrate(224000);
    74.     }
    75.  
    76.     [MenuItem ("Custom/Sound/Set audio compression bitrate (kbps)/240")]
    77.     static void SetCompressionBitrate_240kbps() {
    78.         SelectedSetCompressionBitrate(240000);
    79.     }
    80.  
    81.     // ----------------------------------------------------------------------------
    82.  
    83.     [MenuItem ("Custom/Sound/Toggle decompress on load/Disable")]
    84.     static void ToggleDecompressOnLoad_Disable() {
    85.         SelectedToggleDecompressOnLoadSettings(false);
    86.     }
    87.  
    88.     [MenuItem ("Custom/Sound/Toggle decompress on load/Enable")]
    89.     static void ToggleDecompressOnLoad_Enable() {
    90.         SelectedToggleDecompressOnLoadSettings(true);
    91.     }
    92.  
    93.     // ----------------------------------------------------------------------------
    94.  
    95.     [MenuItem ("Custom/Sound/Toggle 3D sound/Disable")]
    96.     static void Toggle3DSound_Disable() {
    97.         SelectedToggle3DSoundSettings(false);
    98.     }
    99.  
    100.     [MenuItem ("Custom/Sound/Toggle 3D sound/Enable")]
    101.     static void Toggle3DSound_Enable() {
    102.         SelectedToggle3DSoundSettings(true);
    103.     }
    104.  
    105.     // ----------------------------------------------------------------------------
    106.  
    107.     [MenuItem ("Custom/Sound/Toggle mono/Auto")]
    108.     static void ToggleForceToMono_Auto() {
    109.         SelectedToggleForceToMonoSettings(false);
    110.     }
    111.  
    112.     [MenuItem ("Custom/Sound/Toggle mono/Forced")]
    113.     static void ToggleForceToMono_Forced() {
    114.         SelectedToggleForceToMonoSettings(true);
    115.     }
    116.  
    117.     // ----------------------------------------------------------------------------
    118.  
    119.     static void SelectedToggleCompressionSettings(AudioImporterFormat newFormat) {
    120.  
    121.         Object[] audioclips = GetSelectedAudioclips();
    122.         Selection.objects = new Object[0];
    123.         foreach (AudioClip audioclip in audioclips) {
    124.             string path = AssetDatabase.GetAssetPath(audioclip);
    125.             AudioImporter audioImporter = AssetImporter.GetAtPath(path) as AudioImporter;
    126.             audioImporter.format = newFormat;
    127.             AssetDatabase.ImportAsset(path);
    128.         }
    129.     }
    130.  
    131.     static void SelectedSetCompressionBitrate(float newCompressionBitrate) {
    132.  
    133.         Object[] audioclips = GetSelectedAudioclips();
    134.         Selection.objects = new Object[0];
    135.         foreach (AudioClip audioclip in audioclips) {
    136.             string path = AssetDatabase.GetAssetPath(audioclip);
    137.             AudioImporter audioImporter = AssetImporter.GetAtPath(path) as AudioImporter;
    138.             audioImporter.compressionBitrate = newCompressionBitrate;
    139.             AssetDatabase.ImportAsset(path);
    140.         }
    141.     }
    142.  
    143.     static void SelectedToggleDecompressOnLoadSettings(bool enabled) {
    144.  
    145.         Object[] audioclips = GetSelectedAudioclips();
    146.         Selection.objects = new Object[0];
    147.         foreach (AudioClip audioclip in audioclips) {
    148.             string path = AssetDatabase.GetAssetPath(audioclip);
    149.             AudioImporter audioImporter = AssetImporter.GetAtPath(path) as AudioImporter;
    150.             audioImporter.decompressOnLoad = enabled;
    151.             AssetDatabase.ImportAsset(path);
    152.         }
    153.     }
    154.  
    155.     static void SelectedToggle3DSoundSettings(bool enabled) {
    156.  
    157.         Object[] audioclips = GetSelectedAudioclips();
    158.         Selection.objects = new Object[0];
    159.         foreach (AudioClip audioclip in audioclips) {
    160.             string path = AssetDatabase.GetAssetPath(audioclip);
    161.             AudioImporter audioImporter = AssetImporter.GetAtPath(path) as AudioImporter;
    162.             audioImporter.threeD = enabled;
    163.             AssetDatabase.ImportAsset(path);
    164.         }
    165.     }
    166.  
    167.     static void SelectedToggleForceToMonoSettings(bool enabled) {
    168.  
    169.         Object[] audioclips = GetSelectedAudioclips();
    170.         Selection.objects = new Object[0];
    171.         foreach (AudioClip audioclip in audioclips) {
    172.             string path = AssetDatabase.GetAssetPath(audioclip);
    173.             AudioImporter audioImporter = AssetImporter.GetAtPath(path) as AudioImporter;
    174.             audioImporter.forceToMono = enabled;
    175.             AssetDatabase.ImportAsset(path);
    176.         }
    177.     }
    178.  
    179.     static Object[] GetSelectedAudioclips()
    180.     {
    181.         return Selection.GetFiltered(typeof(AudioClip), SelectionMode.DeepAssets);
    182.     }
    183. }
    184.  
    I tested it briefly on my project but please post any fix which may prove necessary.

    Notice that Jashan already posted something similar here but I didn't find it on my first searches.
     
    JonPQ, bugmagnet and Cousken like this.
  2. Ony

    Ony

    Joined:
    Apr 26, 2009
    Posts:
    1,964
    Exactly what I needed right when I needed it. Thanks!
     
  3. MikeHergaarden

    MikeHergaarden

    Joined:
    Mar 9, 2008
    Posts:
    1,023
    Same here, awesome! Was just about to create something myself.
     
  4. Evil-Dog

    Evil-Dog

    Joined:
    Oct 4, 2011
    Posts:
    134
    That's awesome thanks a lot.
     
  5. luvcraft

    luvcraft

    Joined:
    Aug 22, 2011
    Posts:
    34
    thanks! I was about to make exactly this same thing but decided to see if anyone had beaten me to it. :)

    a few fixes:

    I changed your "SelectedToggleDecompressOnLoadSettings" to:

    static void SelectedToggleDecompressOnLoadSettings(AudioImporterLoadType loadType) {

    Object[] audioclips = GetSelectedAudioclips();
    Selection.objects = new Object[0];
    foreach (AudioClip audioclip in audioclips) {
    string path = AssetDatabase.GetAssetPath(audioclip);
    AudioImporter audioImporter = AssetImporter.GetAtPath(path) as AudioImporter;
    audioImporter.loadType = loadType;
    AssetDatabase.ImportAsset(path);
    }
    }

    and subsequently changed the corresponding menu items to:

    [MenuItem ("Custom/Sound/Toggle decompress on load/Compressed in memory")]
    static void ToggleDecompressOnLoad_CompressedInMemory() {
    SelectedToggleDecompressOnLoadSettings(AudioImporterLoadType.CompressedInMemory);
    }

    [MenuItem("Custom/Sound/Toggle decompress on load/Decompress on load")]
    static void ToggleDecompressOnLoad_DecompressOnLoad() {
    SelectedToggleDecompressOnLoadSettings(AudioImporterLoadType.DecompressOnLoad);
    }

    [MenuItem("Custom/Sound/Toggle decompress on load/Stream from disc")]
    static void ToggleDecompressOnLoad_StreamFromDisc() {
    SelectedToggleDecompressOnLoadSettings(AudioImporterLoadType.StreamFromDisc);
    }

    I also had to change "SelectedSetCompressionBitrate" to take an int rather than a float

    so now it's:

    Code (csharp):
    1. using UnityEngine;
    2. using UnityEditor;
    3. // /////////////////////////////////////////////////////////////////////////////////////////////////////////
    4. //
    5. // Batch audio import settings modifier.
    6. //
    7. // Modifies all selected audio clips in the project window and applies the requested modification on the
    8. // audio clips. Idea was to have the same choices for multiple files as you would have if you open the
    9. // import settings of a single audio clip. Put this into Assets/Editor and once compiled by Unity you find
    10. // the new functionality in Custom -> Sound. Enjoy! :-)
    11. //
    12. // April 2010. Based on Martin Schultz's texture import settings batch modifier.
    13. //
    14. // /////////////////////////////////////////////////////////////////////////////////////////////////////////
    15. public class ChangeAudioImportSettings : ScriptableObject {
    16.  
    17.     [MenuItem ("Custom/Sound/Toggle audio compression/Disable")]
    18.     static void ToggleCompression_Disable() {
    19.         SelectedToggleCompressionSettings(AudioImporterFormat.Native);
    20.     }
    21.  
    22.     [MenuItem ("Custom/Sound/Toggle audio compression/Enable")]
    23.     static void ToggleCompression_Enable() {
    24.         SelectedToggleCompressionSettings(AudioImporterFormat.Compressed);
    25.     }
    26.  
    27.     // ----------------------------------------------------------------------------
    28.  
    29.     [MenuItem ("Custom/Sound/Set audio compression bitrate (kbps)/32")]
    30.     static void SetCompressionBitrate_32kbps() {
    31.         SelectedSetCompressionBitrate(32000);
    32.     }
    33.  
    34.     [MenuItem ("Custom/Sound/Set audio compression bitrate (kbps)/64")]
    35.     static void SetCompressionBitrate_64kbps() {
    36.         SelectedSetCompressionBitrate(64000);
    37.     }
    38.  
    39.     [MenuItem ("Custom/Sound/Set audio compression bitrate (kbps)/96")]
    40.     static void SetCompressionBitrate_96kbps() {
    41.         SelectedSetCompressionBitrate(96000);
    42.     }
    43.  
    44.     [MenuItem ("Custom/Sound/Set audio compression bitrate (kbps)/128")]
    45.     static void SetCompressionBitrate_128kbps() {
    46.         SelectedSetCompressionBitrate(128000);
    47.     }
    48.  
    49.     [MenuItem ("Custom/Sound/Set audio compression bitrate (kbps)/144")]
    50.     static void SetCompressionBitrate_144kbps() {
    51.         SelectedSetCompressionBitrate(144000);
    52.     }
    53.  
    54.     [MenuItem ("Custom/Sound/Set audio compression bitrate (kbps)/156 (default)")]
    55.     static void SetCompressionBitrate_156kbps() {
    56.         SelectedSetCompressionBitrate(156000);
    57.     }
    58.  
    59.     [MenuItem ("Custom/Sound/Set audio compression bitrate (kbps)/160")]
    60.     static void SetCompressionBitrate_160kbps() {
    61.         SelectedSetCompressionBitrate(160000);
    62.     }
    63.  
    64.     [MenuItem ("Custom/Sound/Set audio compression bitrate (kbps)/192")]
    65.     static void SetCompressionBitrate_192kbps() {
    66.         SelectedSetCompressionBitrate(192000);
    67.     }
    68.  
    69.     [MenuItem ("Custom/Sound/Set audio compression bitrate (kbps)/224")]
    70.     static void SetCompressionBitrate_224kbps() {
    71.         SelectedSetCompressionBitrate(224000);
    72.     }
    73.  
    74.     [MenuItem ("Custom/Sound/Set audio compression bitrate (kbps)/240")]
    75.     static void SetCompressionBitrate_240kbps() {
    76.         SelectedSetCompressionBitrate(240000);
    77.     }
    78.  
    79.     // ----------------------------------------------------------------------------
    80.  
    81.     [MenuItem ("Custom/Sound/Toggle decompress on load/Compressed in memory")]
    82.     static void ToggleDecompressOnLoad_CompressedInMemory() {
    83.         SelectedToggleDecompressOnLoadSettings(AudioImporterLoadType.CompressedInMemory);
    84.     }
    85.  
    86.     [MenuItem("Custom/Sound/Toggle decompress on load/Decompress on load")]
    87.     static void ToggleDecompressOnLoad_DecompressOnLoad() {
    88.         SelectedToggleDecompressOnLoadSettings(AudioImporterLoadType.DecompressOnLoad);
    89.     }
    90.  
    91.     [MenuItem("Custom/Sound/Toggle decompress on load/Stream from disc")]
    92.     static void ToggleDecompressOnLoad_StreamFromDisc() {
    93.         SelectedToggleDecompressOnLoadSettings(AudioImporterLoadType.StreamFromDisc);
    94.     }
    95.  
    96.     // ----------------------------------------------------------------------------
    97.  
    98.     [MenuItem ("Custom/Sound/Toggle 3D sound/Disable")]
    99.     static void Toggle3DSound_Disable() {
    100.         SelectedToggle3DSoundSettings(false);
    101.     }
    102.  
    103.     [MenuItem ("Custom/Sound/Toggle 3D sound/Enable")]
    104.     static void Toggle3DSound_Enable() {
    105.         SelectedToggle3DSoundSettings(true);
    106.     }
    107.  
    108.     // ----------------------------------------------------------------------------
    109.  
    110.     [MenuItem ("Custom/Sound/Toggle mono/Auto")]
    111.     static void ToggleForceToMono_Auto() {
    112.         SelectedToggleForceToMonoSettings(false);
    113.     }
    114.  
    115.     [MenuItem ("Custom/Sound/Toggle mono/Forced")]
    116.     static void ToggleForceToMono_Forced() {
    117.         SelectedToggleForceToMonoSettings(true);
    118.     }
    119.  
    120.     // ----------------------------------------------------------------------------
    121.  
    122.     static void SelectedToggleCompressionSettings(AudioImporterFormat newFormat) {
    123.  
    124.         Object[] audioclips = GetSelectedAudioclips();
    125.         Selection.objects = new Object[0];
    126.         foreach (AudioClip audioclip in audioclips) {
    127.             string path = AssetDatabase.GetAssetPath(audioclip);
    128.             AudioImporter audioImporter = AssetImporter.GetAtPath(path) as AudioImporter;
    129.             audioImporter.format = newFormat;
    130.             AssetDatabase.ImportAsset(path);
    131.         }
    132.     }
    133.  
    134.     static void SelectedSetCompressionBitrate(int newCompressionBitrate) {
    135.  
    136.         Object[] audioclips = GetSelectedAudioclips();
    137.         Selection.objects = new Object[0];
    138.         foreach (AudioClip audioclip in audioclips) {
    139.             string path = AssetDatabase.GetAssetPath(audioclip);
    140.             AudioImporter audioImporter = AssetImporter.GetAtPath(path) as AudioImporter;
    141.             audioImporter.compressionBitrate = newCompressionBitrate;
    142.             AssetDatabase.ImportAsset(path);
    143.         }
    144.     }
    145.  
    146.     static void SelectedToggleDecompressOnLoadSettings(AudioImporterLoadType loadType) {
    147.  
    148.         Object[] audioclips = GetSelectedAudioclips();
    149.         Selection.objects = new Object[0];
    150.         foreach (AudioClip audioclip in audioclips) {
    151.             string path = AssetDatabase.GetAssetPath(audioclip);
    152.             AudioImporter audioImporter = AssetImporter.GetAtPath(path) as AudioImporter;
    153.             audioImporter.loadType = loadType;
    154.             AssetDatabase.ImportAsset(path);
    155.         }
    156.     }
    157.  
    158.     static void SelectedToggle3DSoundSettings(bool enabled) {
    159.  
    160.         Object[] audioclips = GetSelectedAudioclips();
    161.         Selection.objects = new Object[0];
    162.         foreach (AudioClip audioclip in audioclips) {
    163.             string path = AssetDatabase.GetAssetPath(audioclip);
    164.             AudioImporter audioImporter = AssetImporter.GetAtPath(path) as AudioImporter;
    165.             audioImporter.threeD = enabled;
    166.             AssetDatabase.ImportAsset(path);
    167.         }
    168.     }
    169.  
    170.     static void SelectedToggleForceToMonoSettings(bool enabled) {
    171.  
    172.         Object[] audioclips = GetSelectedAudioclips();
    173.         Selection.objects = new Object[0];
    174.         foreach (AudioClip audioclip in audioclips) {
    175.             string path = AssetDatabase.GetAssetPath(audioclip);
    176.             AudioImporter audioImporter = AssetImporter.GetAtPath(path) as AudioImporter;
    177.             audioImporter.forceToMono = enabled;
    178.             AssetDatabase.ImportAsset(path);
    179.         }
    180.     }
    181.  
    182.     static Object[] GetSelectedAudioclips()
    183.     {
    184.         return Selection.GetFiltered(typeof(AudioClip), SelectionMode.DeepAssets);
    185.     }
    186. }
     
    bugmagnet and Cousken like this.
  6. TwisterK

    TwisterK

    Joined:
    Oct 26, 2010
    Posts:
    110
    Thanks for the awesome script, just what I need.
     
  7. scone

    scone

    Joined:
    May 21, 2008
    Posts:
    244
    I think this is a silly way to do it. Here's mine:

    Code (csharp):
    1.  
    2. using UnityEditor;
    3. using UnityEngine;
    4.  
    5. public class SetAudioSettings : EditorWindow {
    6.  
    7.     private AudioImporterFormat format;
    8.     bool threeD, mono, hardware, gapless;
    9.     private AudioImporterLoadType loadType;
    10.     private int compression = 196;
    11.  
    12.     [MenuItem("Tools/Bulk Audio Settings")]
    13.     private static void Init() {
    14.         GetWindow(typeof(SetAudioSettings));
    15.     }
    16.     void OnGUI() {
    17.         format = (AudioImporterFormat)EditorGUILayout.EnumPopup("Audio Format", format);
    18.         threeD = EditorGUILayout.Toggle("3D sound", threeD);
    19.         mono = EditorGUILayout.Toggle("Force to mono", mono);
    20.         loadType = (AudioImporterLoadType)EditorGUILayout.EnumPopup("Load Type", loadType);
    21.         hardware = EditorGUILayout.Toggle("Hardware decoding", hardware);
    22.         gapless = EditorGUILayout.Toggle("Gapless Looping", gapless);
    23.         compression = EditorGUILayout.IntSlider("Compression (kbps)", compression, 0, 256);
    24.  
    25.         if (GUILayout.Button("Set Settings")) {
    26.             foreach (Object o in Selection.GetFiltered(typeof(AudioClip), SelectionMode.DeepAssets)) {
    27.                 string path = AssetDatabase.GetAssetPath(o);
    28.                 AudioImporter audioImporter = AssetImporter.GetAtPath(path) as AudioImporter;
    29.                 audioImporter.format = format;
    30.                 audioImporter.threeD = threeD;
    31.                 audioImporter.forceToMono = mono;
    32.                 audioImporter.loadType = loadType;
    33.                 audioImporter.hardware = hardware;
    34.                 audioImporter.compressionBitrate = compression * 1000;
    35.                 AssetDatabase.ImportAsset(path);
    36.             }
    37.         }
    38.     }
    39. }
    40.  
     
    larku and Cousken like this.
  8. Cousken

    Cousken

    Joined:
    Jan 19, 2013
    Posts:
    1
    Thanks guys this saved me a couple of hours :)
     
  9. Fattie

    Fattie

    Joined:
    Jul 5, 2012
    Posts:
    475
    Note,

    Around 2015 Unity finally added multiple selection of `AudioClip` -

    so fortunately this problem no longer exists.
     
  10. RealSoftGames

    RealSoftGames

    Joined:
    Jun 8, 2014
    Posts:
    220
    what about changing the Load Type through code? i would still prefer to have the option to do this through an editor script.