2017-03-05 15:47:28 +01:00
/**************************************************************************/
/* resource_importer_wav.cpp */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/**************************************************************************/
2018-01-05 00:50:27 +01:00
2017-02-03 00:08:50 -03:00
# include "resource_importer_wav.h"
2017-02-02 22:51:26 -03:00
2018-09-11 18:13:45 +02:00
# include "core/io/resource_saver.h"
2019-04-03 19:11:08 +02:00
2017-02-02 22:51:26 -03:00
String ResourceImporterWAV : : get_importer_name ( ) const {
return " wav " ;
}
String ResourceImporterWAV : : get_visible_name ( ) const {
return " Microsoft WAV " ;
}
2020-05-14 14:29:06 +02:00
2017-02-02 22:51:26 -03:00
void ResourceImporterWAV : : get_recognized_extensions ( List < String > * p_extensions ) const {
p_extensions - > push_back ( " wav " ) ;
}
2020-05-14 14:29:06 +02:00
2017-02-02 22:51:26 -03:00
String ResourceImporterWAV : : get_save_extension ( ) const {
2017-06-15 19:44:11 -03:00
return " sample " ;
2017-02-02 22:51:26 -03:00
}
String ResourceImporterWAV : : get_resource_type ( ) const {
2022-07-23 11:34:36 -03:00
return " AudioStreamWAV " ;
2017-02-02 22:51:26 -03:00
}
2022-05-13 15:04:37 +02:00
bool ResourceImporterWAV : : get_option_visibility ( const String & p_path , const String & p_option , const HashMap < StringName , Variant > & p_options ) const {
2019-07-07 18:53:21 +02:00
if ( p_option = = " force/max_rate_hz " & & ! bool ( p_options [ " force/max_rate " ] ) ) {
return false ;
}
2022-03-15 16:09:39 +01:00
// Don't show begin/end loop points if loop mode is auto-detected or disabled.
if ( ( int ) p_options [ " edit/loop_mode " ] < 2 & & ( p_option = = " edit/loop_begin " | | p_option = = " edit/loop_end " ) ) {
return false ;
}
2017-02-02 22:51:26 -03:00
return true ;
}
int ResourceImporterWAV : : get_preset_count ( ) const {
return 0 ;
}
2020-05-14 14:29:06 +02:00
2017-02-02 22:51:26 -03:00
String ResourceImporterWAV : : get_preset_name ( int p_idx ) const {
return String ( ) ;
}
2021-11-14 14:02:38 -03:00
void ResourceImporterWAV : : get_import_options ( const String & p_path , List < ImportOption > * r_options , int p_preset ) const {
2017-02-02 22:51:26 -03:00
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : BOOL , " force/8_bit " ) , false ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : BOOL , " force/mono " ) , false ) ) ;
2019-07-07 18:53:21 +02:00
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : BOOL , " force/max_rate " , PROPERTY_HINT_NONE , " " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , false ) ) ;
Fix editor suffixes and degrees conversion
* Functions to convert to/from degrees are all gone. Conversion is done by the editor.
* Use PROPERTY_HINT_ANGLE instead of PROPERTY_HINT_RANGE to edit radian angles in degrees.
* Added possibility to add suffixes to range properties, use "min,max[,step][,suffix:<something>]" example "0,100,1,suffix:m"
* In general, can add suffixes for EditorSpinSlider
Not covered by this PR, will have to be addressed by future ones:
* Ability to switch radians/degrees in the inspector for angle properties (if actually wanted).
* Animations previously made will most likely break, need to add a way to make old ones compatible.
* Only added a "px" suffix to 2D position and a "m" one to 3D position, someone needs to go through the rest of the engine and add all remaining suffixes.
* Likely also need to track down usage of EditorSpinSlider outside properties to add suffixes to it too.
2021-06-29 16:42:12 -03:00
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : FLOAT , " force/max_rate_hz " , PROPERTY_HINT_RANGE , " 11025,192000,1,exp " ) , 44100 ) ) ;
2019-08-30 11:46:50 +02:00
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : BOOL , " edit/trim " ) , false ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : BOOL , " edit/normalize " ) , false ) ) ;
2022-07-23 11:34:36 -03:00
// Keep the `edit/loop_mode` enum in sync with AudioStreamWAV::LoopMode (note: +1 offset due to "Detect From WAV").
2022-03-15 16:09:39 +01:00
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : INT , " edit/loop_mode " , PROPERTY_HINT_ENUM , " Detect From WAV,Disabled,Forward,Ping-Pong,Backward " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , 0 ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : INT , " edit/loop_begin " ) , 0 ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : INT , " edit/loop_end " ) , - 1 ) ) ;
2024-08-30 21:32:22 -03:00
// Quite OK Audio is lightweight enough and supports virtually every significant AudioStreamWAV feature.
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : INT , " compress/mode " , PROPERTY_HINT_ENUM , " PCM (Uncompressed),IMA ADPCM,Quite OK Audio " ) , 2 ) ) ;
2017-02-02 22:51:26 -03:00
}
2024-09-23 16:07:40 +02:00
Error ResourceImporterWAV : : import ( ResourceUID : : ID p_source_id , const String & p_source_file , const String & p_save_path , const HashMap < StringName , Variant > & p_options , List < String > * r_platform_variants , List < String > * r_gen_files , Variant * r_metadata ) {
2024-11-11 12:55:57 -05:00
Dictionary options ;
for ( const KeyValue < StringName , Variant > & pair : p_options ) {
options [ pair . key ] = pair . value ;
2017-02-02 22:51:26 -03:00
}
2024-11-11 12:55:57 -05:00
Ref < AudioStreamWAV > sample = AudioStreamWAV : : load_from_file ( p_source_file , options ) ;
2022-06-03 01:33:42 +02:00
ResourceSaver : : save ( sample , p_save_path + " .sample " ) ;
2017-02-02 22:51:26 -03:00
return OK ;
}