@@ -10,6 +10,19 @@ import { Composition } from '../../composition';
1010import { MediaClip } from '../../clips' ;
1111import { Timestamp } from '../../models' ;
1212import { MediaTrack } from './media' ;
13+ import { AudioSource } from '../../sources' ;
14+
15+ class MockMediaClip extends MediaClip {
16+ constructor ( duration : number , range : [ Timestamp , Timestamp ] , silences : { start : Timestamp , stop : Timestamp } [ ] , element : HTMLMediaElement ) {
17+ super ( ) ;
18+ this . duration . millis = range [ 1 ] . millis - range [ 0 ] . millis ;
19+ this . range = range ;
20+ this . source = {
21+ silences : async ( ) => silences ,
22+ } as any as AudioSource ;
23+ this . element = element ;
24+ }
25+ }
1326
1427describe ( 'The Media Track Object' , ( ) => {
1528 let comp : Composition ;
@@ -23,6 +36,83 @@ describe('The Media Track Object', () => {
2336 track . on ( 'update' , updateMock ) ;
2437 } ) ;
2538
39+ it ( 'ignores no silences' , async ( ) => {
40+ const clip = new MediaClip ( ) ;
41+ clip . duration . frames = 30 ;
42+ await track . add ( clip ) ;
43+ await track . removeSilences ( ) ;
44+ expect ( track . clips . length ) . toBe ( 1 ) ;
45+ } ) ;
46+
47+ // it('ignores not applicable silences', async () => {
48+ // const clip = new MockMediaClip(30000, [new Timestamp(10000), new Timestamp(20000)], [
49+ // {
50+ // start: new Timestamp(0),
51+ // stop: new Timestamp(500),
52+ // },
53+ // {
54+ // start: new Timestamp(30000),
55+ // stop: new Timestamp(30500),
56+ // },
57+ // ], new Audio());
58+ // await track.add(clip);
59+ // expect(clip.source).toBeDefined();
60+ // await track.removeSilences();
61+ // expect(track.clips.length).toBe(1);
62+ // expect(track.clips.at(0)).toBe(clip);
63+ // });
64+
65+ it ( 'removes silences' , async ( ) => {
66+ const clip = new MockMediaClip ( 30000 , [ new Timestamp ( 10000 ) , new Timestamp ( 20000 ) ] , [
67+ {
68+ start : new Timestamp ( 0 ) ,
69+ stop : new Timestamp ( 10050 ) ,
70+ } ,
71+ {
72+ start : new Timestamp ( 11000 ) ,
73+ stop : new Timestamp ( 15000 ) ,
74+ } ,
75+ {
76+ start : new Timestamp ( 19000 ) ,
77+ stop : new Timestamp ( 30500 ) ,
78+ } ,
79+ ] , new Audio ( ) ) ;
80+ await track . add ( clip ) ;
81+ expect ( clip . source ) . toBeDefined ( ) ;
82+ await track . removeSilences ( ) ;
83+ expect ( track . clips . length ) . toBe ( 2 ) ;
84+ expect ( track . clips . at ( 0 ) ?. range [ 0 ] . millis ) . toBe ( 10051 ) ;
85+ expect ( track . clips . at ( 0 ) ?. range [ 1 ] . millis ) . toBe ( 11000 ) ;
86+ expect ( track . clips . at ( 1 ) ?. range [ 0 ] . millis ) . toBe ( 15001 ) ;
87+ expect ( track . clips . at ( 1 ) ?. range [ 1 ] . millis ) . toBe ( 19000 ) ;
88+ } ) ;
89+
90+ it ( 'removes silences stacked' , async ( ) => {
91+ track . stacked ( true ) ;
92+ const clip = new MockMediaClip ( 30000 , [ new Timestamp ( 10000 ) , new Timestamp ( 20000 ) ] , [
93+ {
94+ start : new Timestamp ( 0 ) ,
95+ stop : new Timestamp ( 10050 ) ,
96+ } ,
97+ {
98+ start : new Timestamp ( 11000 ) ,
99+ stop : new Timestamp ( 15000 ) ,
100+ } ,
101+ {
102+ start : new Timestamp ( 19000 ) ,
103+ stop : new Timestamp ( 30500 ) ,
104+ } ,
105+ ] , new Audio ( ) ) ;
106+ await track . add ( clip ) ;
107+ expect ( clip . source ) . toBeDefined ( ) ;
108+ await track . removeSilences ( ) ;
109+ expect ( track . clips . length ) . toBe ( 2 ) ;
110+ expect ( track . clips . at ( 0 ) ?. range [ 0 ] . millis ) . toBe ( 10051 ) ;
111+ expect ( track . clips . at ( 0 ) ?. range [ 1 ] . millis ) . toBe ( 11000 ) ;
112+ expect ( track . clips . at ( 1 ) ?. range [ 0 ] . millis ) . toBe ( 11001 ) ;
113+ expect ( track . clips . at ( 1 ) ?. range [ 1 ] . millis ) . toBe ( 15000 ) ;
114+ } ) ;
115+
26116 it ( 'should propagate a seek call' , async ( ) => {
27117 const clip = new MediaClip ( ) ;
28118 clip . element = new Audio ( ) ;
0 commit comments