2011-02-23 10:52:22 +00:00
/*
2009-08-28 21:31:13 +00:00
* $ Id $
2009-08-28 11:13:45 +00:00
*
* * * * * * BEGIN GPL LICENSE BLOCK * * * * *
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software Foundation ,
2010-02-12 13:34:04 +00:00
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
2009-08-28 11:13:45 +00:00
*
* The Original Code is Copyright ( C ) 2007 Blender Foundation .
* All rights reserved .
*
*
* Contributor ( s ) : Blender Foundation
*
* * * * * * END GPL LICENSE BLOCK * * * * *
*/
2011-02-27 20:29:51 +00:00
/** \file blender/editors/sound/sound_ops.c
* \ ingroup edsnd
*/
2009-08-28 21:47:05 +00:00
# include <string.h>
# include <stdlib.h>
2009-08-28 11:13:45 +00:00
# include <stdio.h>
2011-01-26 14:18:16 +00:00
# include <stddef.h>
2009-08-28 11:13:45 +00:00
2010-05-29 21:31:57 +00:00
# include "MEM_guardedalloc.h"
2011-01-07 18:36:47 +00:00
# include "BLI_blenlib.h"
# include "BLI_utildefines.h"
2009-08-28 21:47:05 +00:00
# include "DNA_packedFile_types.h"
2009-08-28 11:13:45 +00:00
# include "DNA_scene_types.h"
# include "DNA_space_types.h"
2009-08-28 21:47:05 +00:00
# include "DNA_sequence_types.h"
2010-08-04 04:01:27 +00:00
# include "DNA_sound_types.h"
2010-05-29 21:31:57 +00:00
# include "DNA_userdef_types.h"
2009-08-28 11:13:45 +00:00
# include "BKE_context.h"
2009-08-28 21:47:05 +00:00
# include "BKE_global.h"
2011-01-26 14:18:16 +00:00
# include "BKE_main.h"
2009-08-28 11:13:45 +00:00
# include "BKE_report.h"
2009-08-28 21:47:05 +00:00
# include "BKE_packedFile.h"
2009-08-28 11:13:45 +00:00
# include "BKE_sound.h"
# include "RNA_access.h"
# include "RNA_define.h"
2009-08-28 21:47:05 +00:00
# include "RNA_enum_types.h"
# include "UI_interface.h"
2009-08-28 11:13:45 +00:00
# include "WM_api.h"
# include "WM_types.h"
# include "AUD_C-API.h"
2011-02-14 17:55:27 +00:00
# include "ED_sound.h"
2011-01-26 14:18:16 +00:00
# include "ED_util.h"
2009-08-28 11:13:45 +00:00
# include "sound_intern.h"
/******************** open sound operator ********************/
2010-05-29 21:31:57 +00:00
static void open_init ( bContext * C , wmOperator * op )
{
PropertyPointerRNA * pprop ;
op - > customdata = pprop = MEM_callocN ( sizeof ( PropertyPointerRNA ) , " OpenPropertyPointerRNA " ) ;
uiIDContextProperty ( C , & pprop - > ptr , & pprop - > prop ) ;
}
2009-08-28 11:13:45 +00:00
static int open_exec ( bContext * C , wmOperator * op )
{
2009-09-12 19:54:39 +00:00
char path [ FILE_MAX ] ;
2009-08-28 11:13:45 +00:00
bSound * sound ;
2010-05-29 21:31:57 +00:00
PropertyPointerRNA * pprop ;
PointerRNA idptr ;
2009-08-28 11:13:45 +00:00
AUD_SoundInfo info ;
2010-06-14 03:52:10 +00:00
RNA_string_get ( op - > ptr , " filepath " , path ) ;
2009-09-12 19:54:39 +00:00
sound = sound_new_file ( CTX_data_main ( C ) , path ) ;
2009-08-28 11:13:45 +00:00
2010-05-29 21:31:57 +00:00
if ( ! op - > customdata )
open_init ( C , op ) ;
2010-02-07 23:41:17 +00:00
if ( sound = = NULL | | sound - > playback_handle = = NULL ) {
2010-05-29 21:31:57 +00:00
if ( op - > customdata ) MEM_freeN ( op - > customdata ) ;
2009-08-28 11:13:45 +00:00
BKE_report ( op - > reports , RPT_ERROR , " Unsupported audio format " ) ;
return OPERATOR_CANCELLED ;
}
2010-02-07 23:41:17 +00:00
info = AUD_getInfo ( sound - > playback_handle ) ;
2009-08-28 11:13:45 +00:00
2010-01-01 05:09:30 +00:00
if ( info . specs . channels = = AUD_CHANNELS_INVALID ) {
2009-08-28 11:13:45 +00:00
sound_delete ( C , sound ) ;
2010-05-29 21:31:57 +00:00
if ( op - > customdata ) MEM_freeN ( op - > customdata ) ;
2009-08-28 11:13:45 +00:00
BKE_report ( op - > reports , RPT_ERROR , " Unsupported audio format " ) ;
return OPERATOR_CANCELLED ;
}
2009-08-29 14:53:00 +00:00
if ( RNA_boolean_get ( op - > ptr , " cache " ) ) {
sound_cache ( sound , 0 ) ;
}
2010-05-29 21:31:57 +00:00
/* hook into UI */
pprop = op - > customdata ;
if ( pprop - > prop ) {
/* when creating new ID blocks, use is already 1, but RNA
* pointer se also increases user , so this compensates it */
sound - > id . us - - ;
RNA_id_pointer_create ( & sound - > id , & idptr ) ;
RNA_property_pointer_set ( & pprop - > ptr , pprop - > prop , idptr ) ;
RNA_property_update ( C , & pprop - > ptr , pprop - > prop ) ;
}
2009-08-29 14:53:00 +00:00
2010-06-03 07:28:47 +00:00
if ( op - > customdata ) MEM_freeN ( op - > customdata ) ;
2009-08-28 11:13:45 +00:00
return OPERATOR_FINISHED ;
}
static int open_invoke ( bContext * C , wmOperator * op , wmEvent * event )
{
2010-05-29 21:31:57 +00:00
if ( ! RNA_property_is_set ( op - > ptr , " relative_path " ) )
RNA_boolean_set ( op - > ptr , " relative_path " , U . flag & USER_RELPATHS ) ;
2010-06-14 03:52:10 +00:00
if ( RNA_property_is_set ( op - > ptr , " filepath " ) )
2010-05-29 21:31:57 +00:00
return open_exec ( C , op ) ;
open_init ( C , op ) ;
2009-08-28 11:13:45 +00:00
return WM_operator_filesel ( C , op , event ) ;
}
void SOUND_OT_open ( wmOperatorType * ot )
{
/* identifiers */
2009-08-28 12:27:29 +00:00
ot - > name = " Open Sound " ;
2010-02-10 21:15:44 +00:00
ot - > description = " Load a sound file " ;
2009-08-28 11:13:45 +00:00
ot - > idname = " SOUND_OT_open " ;
/* api callbacks */
ot - > exec = open_exec ;
ot - > invoke = open_invoke ;
/* flags */
ot - > flag = OPTYPE_REGISTER | OPTYPE_UNDO ;
/* properties */
2010-07-11 09:50:23 +00:00
WM_operator_properties_filesel ( ot , FOLDERFILE | SOUNDFILE | MOVIEFILE , FILE_SPECIAL , FILE_OPENFILE , WM_FILESEL_FILEPATH | WM_FILESEL_RELPATH ) ;
2009-08-29 14:53:00 +00:00
RNA_def_boolean ( ot - > srna , " cache " , FALSE , " Cache " , " Cache the sound in memory. " ) ;
2009-08-28 11:13:45 +00:00
}
/* ******************************************************* */
2009-08-28 21:47:05 +00:00
static int sound_poll ( bContext * C )
{
Editing * ed = CTX_data_scene ( C ) - > ed ;
2009-08-28 22:04:37 +00:00
if ( ! ed | | ! ed - > act_seq | | ed - > act_seq - > type ! = SEQ_SOUND )
2009-08-28 21:47:05 +00:00
return 0 ;
return 1 ;
}
/********************* pack operator *********************/
static int pack_exec ( bContext * C , wmOperator * op )
{
Editing * ed = CTX_data_scene ( C ) - > ed ;
bSound * sound ;
if ( ! ed | | ! ed - > act_seq | | ed - > act_seq - > type ! = SEQ_SOUND )
return OPERATOR_CANCELLED ;
sound = ed - > act_seq - > sound ;
if ( ! sound | | sound - > packedfile )
return OPERATOR_CANCELLED ;
sound - > packedfile = newPackedFile ( op - > reports , sound - > name ) ;
2010-10-17 09:01:37 +00:00
sound_load ( CTX_data_main ( C ) , sound ) ;
2009-08-28 21:47:05 +00:00
return OPERATOR_FINISHED ;
}
2011-02-14 17:55:27 +00:00
static void SOUND_OT_pack ( wmOperatorType * ot )
2009-08-28 21:47:05 +00:00
{
/* identifiers */
ot - > name = " Pack Sound " ;
2010-02-10 21:15:44 +00:00
ot - > description = " Pack the sound into the current blend file " ;
2009-08-28 21:47:05 +00:00
ot - > idname = " SOUND_OT_pack " ;
/* api callbacks */
ot - > exec = pack_exec ;
ot - > poll = sound_poll ;
/* flags */
ot - > flag = OPTYPE_REGISTER | OPTYPE_UNDO ;
}
/********************* unpack operator *********************/
2011-01-26 14:18:16 +00:00
static int sound_unpack_exec ( bContext * C , wmOperator * op )
2009-08-28 21:47:05 +00:00
{
int method = RNA_enum_get ( op - > ptr , " method " ) ;
2011-02-07 01:13:21 +00:00
bSound * sound = NULL ;
2009-08-28 21:47:05 +00:00
2011-01-26 14:18:16 +00:00
/* find the suppplied image by name */
if ( RNA_property_is_set ( op - > ptr , " id " ) ) {
2011-04-19 06:59:49 +00:00
char sndname [ MAX_ID_NAME - 2 ] ;
2011-01-26 14:18:16 +00:00
RNA_string_get ( op - > ptr , " id " , sndname ) ;
sound = BLI_findstring ( & CTX_data_main ( C ) - > sound , sndname , offsetof ( ID , name ) + 2 ) ;
}
2009-08-28 21:47:05 +00:00
if ( ! sound | | ! sound - > packedfile )
return OPERATOR_CANCELLED ;
if ( G . fileflags & G_AUTOPACK )
BKE_report ( op - > reports , RPT_WARNING , " AutoPack is enabled, so image will be packed again on file save. " ) ;
2010-11-13 13:44:45 +00:00
unpackSound ( CTX_data_main ( C ) , op - > reports , sound , method ) ;
2009-08-28 21:47:05 +00:00
return OPERATOR_FINISHED ;
}
2011-01-26 14:18:16 +00:00
static int sound_unpack_invoke ( bContext * C , wmOperator * op , wmEvent * UNUSED ( event ) )
2009-08-28 21:47:05 +00:00
{
Editing * ed = CTX_data_scene ( C ) - > ed ;
bSound * sound ;
2011-01-26 14:18:16 +00:00
if ( RNA_property_is_set ( op - > ptr , " id " ) )
return sound_unpack_exec ( C , op ) ;
2009-08-28 21:47:05 +00:00
if ( ! ed | | ! ed - > act_seq | | ed - > act_seq - > type ! = SEQ_SOUND )
return OPERATOR_CANCELLED ;
sound = ed - > act_seq - > sound ;
if ( ! sound | | ! sound - > packedfile )
return OPERATOR_CANCELLED ;
if ( G . fileflags & G_AUTOPACK )
BKE_report ( op - > reports , RPT_WARNING , " AutoPack is enabled, so image will be packed again on file save. " ) ;
2011-04-18 14:24:36 +00:00
unpack_menu ( C , " SOUND_OT_unpack " , sound - > id . name + 2 , sound - > name , " sounds " , sound - > packedfile ) ;
2009-08-28 21:47:05 +00:00
return OPERATOR_FINISHED ;
}
2011-02-14 17:55:27 +00:00
static void SOUND_OT_unpack ( wmOperatorType * ot )
2009-08-28 21:47:05 +00:00
{
/* identifiers */
ot - > name = " Unpack Sound " ;
2010-02-10 21:15:44 +00:00
ot - > description = " Unpack the sound to the samples filename " ;
2009-08-28 21:47:05 +00:00
ot - > idname = " SOUND_OT_unpack " ;
/* api callbacks */
2011-01-26 14:18:16 +00:00
ot - > exec = sound_unpack_exec ;
ot - > invoke = sound_unpack_invoke ;
2009-08-28 21:47:05 +00:00
ot - > poll = sound_poll ;
/* flags */
ot - > flag = OPTYPE_REGISTER | OPTYPE_UNDO ;
/* properties */
RNA_def_enum ( ot - > srna , " method " , unpack_method_items , PF_USE_LOCAL , " Method " , " How to unpack. " ) ;
2011-04-19 06:59:49 +00:00
RNA_def_string ( ot - > srna , " id " , " " , MAX_ID_NAME - 2 , " Sound Name " , " Sound datablock name to unpack. " ) ; /* XXX, weark!, will fail with library, name collisions */
2009-08-28 21:47:05 +00:00
}
/* ******************************************************* */
2009-08-28 12:27:29 +00:00
void ED_operatortypes_sound ( void )
2009-08-28 11:13:45 +00:00
{
WM_operatortype_append ( SOUND_OT_open ) ;
2009-08-28 21:47:05 +00:00
WM_operatortype_append ( SOUND_OT_pack ) ;
WM_operatortype_append ( SOUND_OT_unpack ) ;
2009-08-28 11:13:45 +00:00
}