44#include " zq/zquest.h"
55#include " zq/zq_class.h"
66#include " zc_list_data.h"
7+ #include " zc/zc_sys.h"
8+ #include " play_midi.h"
79#include " info.h"
810#include " subscr.h"
911#include < fmt/format.h>
1012#include < base/qrs.h>
13+ #include " music_playback.h"
1114
1215static size_t editdmap_tab = 0 ;
1316static int32_t dmap_use_script_data = 2 ;
17+ extern int32_t midi_volume;
1418extern script_data* dmapscripts[NUMSCRIPTSDMAP];
1519#define DSCRDATA_NONE 0x00
1620#define DSCRDATA_ACTIVE 0x01
@@ -63,11 +67,22 @@ EditDMapDialog::EditDMapDialog(int32_t slot) :
6367 }
6468}
6569
66- // trims spaces at the end of a string
67- bool EditDMapDialog::disableEnhancedMusic ()
70+ bool EditDMapDialog::disableEnhancedMusic (bool disableontracker)
6871{
6972 if (local_dmap.tmusic [0 ] == 0 )
7073 return true ;
74+
75+ ZCMUSIC* tempdmapzcmusic = zcmusic_load_for_quest (local_dmap.tmusic , filepath);
76+ bool isTracker = true ;
77+
78+ if (tempdmapzcmusic != NULL )
79+ {
80+ if (disableontracker && !(tempdmapzcmusic->type == ZCMF_MP3 || tempdmapzcmusic->type == ZCMF_OGG))
81+ return true ;
82+ }
83+ else
84+ return true ;
85+
7186 return false ;
7287}
7388
@@ -78,6 +93,47 @@ bool EditDMapDialog::disableMusicTracks()
7893 return disableEnhancedMusic ();
7994}
8095
96+ void EditDMapDialog::silenceMusicPreview ()
97+ {
98+ zc_stop_midi ();
99+
100+ if (zcmusic != NULL )
101+ {
102+ zcmusic_stop (zcmusic);
103+ zcmusic_unload_file (zcmusic);
104+ zcmusic = NULL ;
105+ zcmixer->newtrack = NULL ;
106+ }
107+ }
108+
109+ void EditDMapDialog::musicPreview (bool previewloop)
110+ {
111+ silenceMusicPreview ();
112+
113+ if (local_dmap.tmusic [0 ] == 0 )
114+ {
115+ if (local_dmap.midi > 3 )
116+ zc_play_midi ((MIDI*)customtunes[local_dmap.midi -4 ].data , true );
117+ }
118+ else
119+ {
120+ if (local_dmap.tmusic [0 ])
121+ {
122+ if (play_enh_music_crossfade (local_dmap.tmusic , filepath, local_dmap.tmusictrack , midi_volume, (previewloop || musicpreview_saved) ? 0 : local_dmap.tmusic_xfade_in , local_dmap.tmusic_xfade_out ))
123+ {
124+ if (previewloop)
125+ {
126+ int32_t startpos = zc_max (local_dmap.tmusic_loop_end - 10000 , 0 );
127+ zcmusic_set_curpos (zcmusic, startpos);
128+ }
129+ if (musicpreview_saved)
130+ zcmusic_set_curpos (zcmusic, musicpreview_saved);
131+ zcmusic_set_loop (zcmusic, double (local_dmap.tmusic_loop_start / 10000.0 ), double (local_dmap.tmusic_loop_end / 10000.0 ));
132+ }
133+ }
134+ }
135+ }
136+
81137bool sm_dmap (int dmaptype)
82138{
83139 switch (dmaptype & dmfTYPE)
@@ -192,6 +248,20 @@ std::shared_ptr<GUI::Widget> EditDMapDialog::view()
192248 window = Window (
193249 title = titlebuf,
194250 onClose = message::CANCEL,
251+ use_vsync = true ,
252+ onTick = [&]()
253+ {
254+ zcmixer_update (zcmixer, midi_volume, 1000000 , false );
255+ if (zcmusic)
256+ {
257+ int32_t pos = zcmusic_get_curpos (zcmusic);
258+ if (pos > 0 )
259+ tmusic_progress_lbl->setText (fmt::format (" {:.4f}s" , pos / 10000.0 ));
260+ else
261+ tmusic_progress_lbl->setText (" " );
262+ }
263+ return ONTICK_CONTINUE;
264+ },
195265 Column (
196266 Row (hAlign = 0.0 ,
197267 Label (text = " Name:" , hAlign = 0.0 , colSpan = 2 ),
@@ -213,6 +283,7 @@ std::shared_ptr<GUI::Widget> EditDMapDialog::view()
213283 ptr = &editdmap_tab,
214284 onSwitch = [&](size_t , size_t )
215285 {
286+ silenceMusicPreview ();
216287 refreshGridSquares ();
217288 },
218289 TabRef (name = " Mechanics" , Column (
@@ -498,7 +569,7 @@ std::shared_ptr<GUI::Widget> EditDMapDialog::view()
498569 tmusic_start_field = TextField (
499570 fitParent = true , hAlign = 0.0 ,
500571 type = GUI::TextField::type::FIXED_DECIMAL,
501- disabled = disableEnhancedMusic (),
572+ disabled = disableEnhancedMusic (true ),
502573 low = 0 , high = 2147479999 ,
503574 val = local_dmap.tmusic_loop_start ,
504575 onValChangedFunc = [&](GUI::TextField::type, std::string_view, int32_t val)
@@ -509,7 +580,7 @@ std::shared_ptr<GUI::Widget> EditDMapDialog::view()
509580 tmusic_end_field = TextField (
510581 fitParent = true , hAlign = 0.0 ,
511582 type = GUI::TextField::type::FIXED_DECIMAL,
512- disabled = disableEnhancedMusic (),
583+ disabled = disableEnhancedMusic (true ),
513584 val = local_dmap.tmusic_loop_end ,
514585 low = 0 , high = 2147479999 ,
515586 onValChangedFunc = [&](GUI::TextField::type, std::string_view, int32_t val)
@@ -542,10 +613,57 @@ std::shared_ptr<GUI::Widget> EditDMapDialog::view()
542613 })
543614 )
544615 ),
616+ tmusic_progress_lbl = Label (text = " " , hAlign = 0.0 ),
617+ Rows<3 >(
618+ tmusic_preview_btn = Button (text = " Preview" ,
619+ maxheight = 24_px,
620+ disabled = disableEnhancedMusic (),
621+ onPressFunc = [&]()
622+ {
623+ musicpreview_saved = 0 ;
624+ musicPreview ();
625+ }),
626+ tmusic_previewloop_btn = Button (text = " Preview Loop" ,
627+ maxheight = 24_px,
628+ disabled = disableEnhancedMusic (true ),
629+ onPressFunc = [&]()
630+ {
631+ musicpreview_saved = 0 ;
632+ musicPreview (true );
633+ }),
634+ tmusic_previewstop_btn = Button (text = " Pause" ,
635+ maxheight = 24_px,
636+ disabled = disableEnhancedMusic (true ),
637+ onPressFunc = [&]()
638+ {
639+ if (musicpreview_saved)
640+ {
641+ musicPreview ();
642+ musicpreview_saved = 0 ;
643+ }
644+ else
645+ {
646+ if (zcmusic)
647+ musicpreview_saved = zcmusic_get_curpos (zcmusic);
648+ silenceMusicPreview ();
649+ }
650+ })
651+ ),
545652 Rows<2 >(
546653 Button (text = " Load" ,
654+ maxheight = 24_px,
547655 onPressFunc = [&]()
548656 {
657+ zc_stop_midi ();
658+
659+ if (zcmusic != NULL )
660+ {
661+ zcmusic_stop (zcmusic);
662+ zcmusic_unload_file (zcmusic);
663+ zcmusic = NULL ;
664+ zcmixer->newtrack = NULL ;
665+ }
666+
549667 if (getname (" Load DMap Music" , (char *)zcmusic_types, NULL , tmusicpath, false ))
550668 {
551669 strcpy (tmusicpath, temppath);
@@ -578,23 +696,40 @@ std::shared_ptr<GUI::Widget> EditDMapDialog::view()
578696
579697 tmusic_field->setText (local_dmap.tmusic );
580698 tmusic_track_list->setDisabled (disableMusicTracks ());
581- tmusic_start_field->setDisabled (disableEnhancedMusic ());
582- tmusic_end_field->setDisabled (disableEnhancedMusic ());
699+ tmusic_start_field->setDisabled (disableEnhancedMusic (true ));
700+ tmusic_end_field->setDisabled (disableEnhancedMusic (true ));
583701 tmusic_xfadein_field->setDisabled (disableEnhancedMusic ());
584702 tmusic_xfadeout_field->setDisabled (disableEnhancedMusic ());
703+ tmusic_preview_btn->setDisabled (disableEnhancedMusic ());
704+ tmusic_previewloop_btn->setDisabled (disableEnhancedMusic (true ));
705+ tmusic_previewstop_btn->setDisabled (disableEnhancedMusic (true ));
585706 }
586707 }
587708 }),
588709 Button (text = " Clear" ,
710+ maxheight = 24_px,
589711 onPressFunc = [&]()
590712 {
713+ zc_stop_midi ();
714+
715+ if (zcmusic != NULL )
716+ {
717+ zcmusic_stop (zcmusic);
718+ zcmusic_unload_file (zcmusic);
719+ zcmusic = NULL ;
720+ zcmixer->newtrack = NULL ;
721+ }
722+
591723 memset (local_dmap.tmusic , 0 , 56 );
592724 tmusic_field->setText (" " );
593725 tmusic_track_list->setDisabled (true );
594726 tmusic_start_field->setDisabled (true );
595727 tmusic_end_field->setDisabled (true );
596728 tmusic_xfadein_field->setDisabled (true );
597729 tmusic_xfadeout_field->setDisabled (true );
730+ tmusic_preview_btn->setDisabled (true );
731+ tmusic_previewloop_btn->setDisabled (true );
732+ tmusic_previewstop_btn->setDisabled (true );
598733 })
599734 )
600735 )
@@ -986,6 +1121,7 @@ bool EditDMapDialog::handleMessage(const GUI::DialogMessage<message>& msg)
9861121 [[fallthrough]];
9871122 case message::CANCEL:
9881123 default :
1124+ silenceMusicPreview ();
9891125 return true ;
9901126 }
9911127 return false ;
0 commit comments