39
39
#define trace (fmt ,...)
40
40
41
41
static void
42
- plt_sort_internal (playlist_t * playlist , int iter , int id , const char * format , int order , int version , int is_autosorting );
42
+ plt_sort_internal (playlist_t * playlist , int iter , int id , ddb_tf_context_t * tf_context , const char * tf_bytecode , const char * format , int order , int version , int is_autosorting );
43
43
44
44
static void
45
- plt_sort_v2_internal (playlist_t * plt , int iter , int id , const char * format , int order , int is_autosorting ) {
45
+ plt_sort_v2_internal (playlist_t * plt , int iter , int id , ddb_tf_context_t * tf_context , const char * tf_bytecode , const char * format , int order , int is_autosorting ) {
46
46
ddb_undobuffer_t * undobuffer = ddb_undomanager_get_buffer (ddb_undomanager_shared ());
47
47
if (plt -> undo_enabled ) {
48
48
pl_lock ();
@@ -58,7 +58,7 @@ plt_sort_v2_internal (playlist_t *plt, int iter, int id, const char *format, int
58
58
}
59
59
}
60
60
61
- plt_sort_internal (plt , iter , id , format , order , 1 , is_autosorting );
61
+ plt_sort_internal (plt , iter , id , tf_context , tf_bytecode , format , order , 1 , is_autosorting );
62
62
63
63
if (plt -> undo_enabled ) {
64
64
int count = plt -> count [PL_MAIN ];
@@ -77,13 +77,35 @@ plt_sort_v2_internal (playlist_t *plt, int iter, int id, const char *format, int
77
77
78
78
void
79
79
plt_sort_v2 (playlist_t * plt , int iter , int id , const char * format , int order ) {
80
- plt_sort_v2_internal (plt , iter , id , format , order , 0 );
80
+ plt_sort_v2_internal (plt , iter , id , NULL , NULL , format , order , 0 );
81
+ }
82
+
83
+ void
84
+ plt_sort_v3 (ddb_tf_context_t * tf_ctx , const char * tf_bytecode , int iter , int id , int order ) {
85
+ playlist_t * plt = NULL ;
86
+ if (tf_ctx != NULL ) {
87
+ plt = (playlist_t * )tf_ctx -> plt ;
88
+ }
89
+ plt_sort_v2_internal (plt , iter , id , tf_ctx , tf_bytecode , NULL , order , 0 );
81
90
}
82
91
83
92
// sort for title formatting v1
84
93
void
85
94
plt_sort (playlist_t * playlist , int iter , int id , const char * format , int order ) {
86
- plt_sort_internal (playlist , iter , id , format , order , 0 , 0 );
95
+ ddb_tf_context_t ctx ;
96
+ ddb_tf_context_t * ctxptr = NULL ;
97
+ char * tf_bytecode = NULL ;
98
+ if (format != NULL ) {
99
+ tf_bytecode = tf_compile (format );
100
+ ctx ._size = sizeof (ctx );
101
+ ctx .it = NULL ;
102
+ ctx .plt = (ddb_playlist_t * )playlist ;
103
+ ctx .idx = -1 ;
104
+ ctx .id = id ;
105
+ ctxptr = & ctx ;
106
+ }
107
+
108
+ plt_sort_internal (playlist , iter , id , ctxptr , tf_bytecode , NULL , order , 0 , 0 );
87
109
}
88
110
89
111
static int pl_sort_is_duration ;
@@ -92,7 +114,7 @@ static int pl_sort_ascending;
92
114
static int pl_sort_id ;
93
115
static int pl_sort_version ; // 0: use pl_sort_format, 1: use pl_sort_tf_bytecode
94
116
static const char * pl_sort_format ;
95
- static char * pl_sort_tf_bytecode ;
117
+ static const char * pl_sort_tf_bytecode ;
96
118
static ddb_tf_context_t pl_sort_tf_ctx ;
97
119
98
120
static int
@@ -230,47 +252,62 @@ plt_sort_random (playlist_t *playlist, int iter) {
230
252
// version 0: title formatting v1
231
253
// version 1: title formatting v2
232
254
static void
233
- plt_sort_internal (playlist_t * playlist , int iter , int id , const char * format , int order , int version , int is_autosorting ) {
234
- if (order == DDB_SORT_RANDOM ) {
235
- if (!is_autosorting ) {
236
- plt_replace_meta (playlist , "autosort_mode" , "random" );
237
- }
238
- plt_sort_random (playlist , iter );
239
- return ;
240
- }
255
+ plt_sort_internal (playlist_t * playlist , int iter , int id , ddb_tf_context_t * tf_context , const char * tf_bytecode , const char * format , int order , int version , int is_autosorting ) {
241
256
int ascending = order == DDB_SORT_DESCENDING ? 0 : 1 ;
242
- if (!is_autosorting )
243
- {
244
- plt_set_meta_int (playlist , "autosort_ascending" , ascending );
245
- if (version != 0 && format != NULL ) {
246
- plt_replace_meta (playlist , "autosort_mode" , "tf" );
247
- plt_replace_meta (playlist , "autosort_tf" , format );
257
+
258
+ if (tf_bytecode == NULL ) {
259
+ if (order == DDB_SORT_RANDOM ) {
260
+ if (!is_autosorting ) {
261
+ plt_replace_meta (playlist , "autosort_mode" , "random" );
262
+ }
263
+ plt_sort_random (playlist , iter );
264
+ return ;
265
+ }
266
+ if (!is_autosorting )
267
+ {
268
+ plt_set_meta_int (playlist , "autosort_ascending" , ascending );
269
+ if (version != 0 && format != NULL ) {
270
+ plt_replace_meta (playlist , "autosort_mode" , "tf" );
271
+ plt_replace_meta (playlist , "autosort_tf" , format );
272
+ }
248
273
}
249
- }
250
274
251
- if (format == NULL || id == DB_COLUMN_FILENUMBER || !playlist -> head [iter ] || !playlist -> head [iter ]-> next [iter ]) {
252
- return ;
275
+ if (format == NULL || id == DB_COLUMN_FILENUMBER || !playlist -> head [iter ] || !playlist -> head [iter ]-> next [iter ]) {
276
+ return ;
277
+ }
253
278
}
279
+
254
280
pl_lock ();
255
281
struct timeval tm1 ;
256
282
gettimeofday (& tm1 , NULL );
257
283
pl_sort_ascending = ascending ;
258
284
trace ("ascending: %d\n" , ascending );
259
285
pl_sort_id = id ;
260
286
287
+
288
+ char * free_tf_bytecode = NULL ;
289
+
261
290
pl_sort_version = version ;
262
- if (version == 0 ) {
263
- pl_sort_format = format ;
264
- pl_sort_tf_bytecode = NULL ;
291
+ if (tf_bytecode == NULL ) {
292
+ if (version == 0 ) {
293
+ pl_sort_format = format ;
294
+ pl_sort_tf_bytecode = NULL ;
295
+ }
296
+ else {
297
+ pl_sort_format = NULL ;
298
+ free_tf_bytecode = tf_compile (format );
299
+ pl_sort_tf_bytecode = free_tf_bytecode ;
300
+ pl_sort_tf_ctx ._size = sizeof (pl_sort_tf_ctx );
301
+ pl_sort_tf_ctx .it = NULL ;
302
+ pl_sort_tf_ctx .plt = (ddb_playlist_t * )playlist ;
303
+ pl_sort_tf_ctx .idx = -1 ;
304
+ pl_sort_tf_ctx .id = id ;
305
+ }
265
306
}
266
307
else {
267
308
pl_sort_format = NULL ;
268
- pl_sort_tf_bytecode = tf_compile (format );
269
- pl_sort_tf_ctx ._size = sizeof (pl_sort_tf_ctx );
270
- pl_sort_tf_ctx .it = NULL ;
271
- pl_sort_tf_ctx .plt = (ddb_playlist_t * )playlist ;
272
- pl_sort_tf_ctx .idx = -1 ;
273
- pl_sort_tf_ctx .id = id ;
309
+ pl_sort_tf_bytecode = tf_bytecode ;
310
+ memcpy (& pl_sort_tf_ctx , tf_context , tf_context -> _size );
274
311
}
275
312
276
313
if (format && id == -1
@@ -340,7 +377,10 @@ plt_sort_internal (playlist_t *playlist, int iter, int id, const char *format, i
340
377
}
341
378
342
379
if (version == 1 ) {
343
- tf_free (pl_sort_tf_bytecode );
380
+ if (free_tf_bytecode != NULL ) {
381
+ tf_free (free_tf_bytecode );
382
+ free_tf_bytecode = NULL ;
383
+ }
344
384
pl_sort_tf_bytecode = NULL ;
345
385
memset (& pl_sort_tf_ctx , 0 , sizeof (pl_sort_tf_ctx ));
346
386
}
@@ -366,7 +406,8 @@ sort_track_array (playlist_t *playlist, playItem_t **tracks, int num_tracks, con
366
406
367
407
pl_sort_version = 1 ;
368
408
pl_sort_format = NULL ;
369
- pl_sort_tf_bytecode = tf_compile (format );
409
+ char * tf_bytecode = tf_compile (format );
410
+ pl_sort_tf_bytecode = tf_bytecode ;
370
411
pl_sort_tf_ctx ._size = sizeof (pl_sort_tf_ctx );
371
412
pl_sort_tf_ctx .it = NULL ;
372
413
pl_sort_tf_ctx .plt = (ddb_playlist_t * )playlist ;
@@ -394,7 +435,8 @@ sort_track_array (playlist_t *playlist, playItem_t **tracks, int num_tracks, con
394
435
qsort (tracks , num_tracks , sizeof (playItem_t * ), qsort_cmp_func );
395
436
#endif
396
437
397
- tf_free (pl_sort_tf_bytecode );
438
+ tf_free (tf_bytecode );
439
+ tf_bytecode = NULL ;
398
440
pl_sort_tf_bytecode = NULL ;
399
441
memset (& pl_sort_tf_ctx , 0 , sizeof (pl_sort_tf_ctx ));
400
442
@@ -419,10 +461,10 @@ plt_autosort (playlist_t *plt) {
419
461
if (!fmt ) {
420
462
return ;
421
463
}
422
- plt_sort_v2_internal (plt , PL_MAIN , -1 , fmt , ascending ? DDB_SORT_ASCENDING : DDB_SORT_DESCENDING , 1 );
464
+ plt_sort_v2_internal (plt , PL_MAIN , -1 , NULL , NULL , fmt , ascending ? DDB_SORT_ASCENDING : DDB_SORT_DESCENDING , 1 );
423
465
}
424
466
else if (!strcmp (autosort_mode , "random" )) {
425
- plt_sort_v2_internal (plt , PL_MAIN , -1 , NULL , DDB_SORT_RANDOM , 1 );
467
+ plt_sort_v2_internal (plt , PL_MAIN , -1 , NULL , NULL , NULL , DDB_SORT_RANDOM , 1 );
426
468
}
427
469
428
470
plt_save_config (plt );
0 commit comments