Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /trunk/slmml/Sequencer.cs

Parent Directory Parent Directory | Revision Log Revision Log


Revision 37 - (hide annotations) (download)
Sun Mar 29 15:10:03 2009 UTC (15 years ago) by hikarin
File size: 7291 byte(s)
[ocmml/slmml] * imported SlMML
1 hikarin 37 using System;
2     using System.Collections.Generic;
3     using System.IO;
4     using System.Threading;
5     using System.Windows.Media;
6    
7     namespace SlMML
8     {
9     enum SequencerStep
10     {
11     None,
12     Pre,
13     Track,
14     Post
15     }
16    
17     public sealed class Sequencer : MediaStreamSource
18     {
19     #region 定数の定義
20     public static readonly int BUFFER_SIZE = 8192;
21     public static readonly int BUFFER_ARRAY_SIZE = 2;
22     private static readonly string WAVE_HEADER = "0100020044ac000010b10200040010000000";
23     #endregion
24    
25     #region コンストラクタおよびデストラクタの定義
26     public Sequencer(int multiple)
27     {
28     m_bufferSize = BUFFER_SIZE * multiple;
29     m_buffer = new short[m_bufferSize << 1];
30     m_tracks = new List<Track>();
31     m_multiple = multiple;
32     m_mediaSampleAttributes = new Dictionary<MediaSampleAttributeKeys, string>();
33     MasterVolume = 100;
34     Channel.Initialize(BUFFER_SIZE * multiple);
35     }
36     #endregion
37    
38     #region MediaStreamSourceの派生メソッドの定義
39     protected override void OpenMediaAsync()
40     {
41     m_last = false;
42     m_stream = new MemoryStream(m_bufferSize << 1);
43     m_writer = new BinaryWriter(m_stream);
44     Dictionary<MediaStreamAttributeKeys, string> mediaStreamAttributes = new Dictionary<MediaStreamAttributeKeys, string>();
45     mediaStreamAttributes[MediaStreamAttributeKeys.CodecPrivateData] = WAVE_HEADER;
46     description = new MediaStreamDescription(MediaStreamType.Audio, mediaStreamAttributes);
47     Dictionary<MediaSourceAttributesKeys, string> mediaSourceAttributes = new Dictionary<MediaSourceAttributesKeys, string>();
48     mediaSourceAttributes[MediaSourceAttributesKeys.CanSeek] = false.ToString();
49     mediaSourceAttributes[MediaSourceAttributesKeys.Duration] = (m_tracks[Track.TEMPO_TRACK].Duration * 10).ToString();
50     List<MediaStreamDescription> availableMediaStreams = new List<MediaStreamDescription>();
51     availableMediaStreams.Add(new MediaStreamDescription(MediaStreamType.Audio, mediaStreamAttributes));
52     ReportOpenMediaCompleted(mediaSourceAttributes, availableMediaStreams);
53     ReportGetSampleProgress(0);
54     GetSamples();
55     }
56    
57     protected override void CloseMedia()
58     {
59     m_writer.Close();
60     m_stream.Close();
61     Console.Write("end");
62     }
63    
64     protected override void GetDiagnosticAsync(MediaStreamSourceDiagnosticKind diagnosticKind)
65     {
66     ReportGetDiagnosticCompleted(diagnosticKind, 0);
67     }
68    
69     protected override void GetSampleAsync(MediaStreamType mediaStreamType)
70     {
71     MediaStreamSample sample;
72     if (m_last)
73     {
74     sample = new MediaStreamSample(description, null, 0, 0, 0, m_mediaSampleAttributes);
75     ReportGetSampleCompleted(sample);
76     }
77     else
78     {
79     Track track = m_tracks[Track.TEMPO_TRACK];
80     if (track.End)
81     m_last = true;
82     long ts = 59443;
83     sample = new MediaStreamSample(description, m_stream, 0, m_stream.Length, ts, m_mediaSampleAttributes);
84     ReportGetSampleCompleted(sample);
85     GetSamples();
86     }
87     }
88    
89     protected override void SeekAsync(long seekToTime)
90     {
91     ReportSeekCompleted(seekToTime);
92     }
93    
94     protected override void SwitchMediaStreamAsync(MediaStreamDescription mediaStreamDescription)
95     {
96     ReportSwitchMediaStreamCompleted(mediaStreamDescription);
97     }
98     #endregion
99    
100     #region 公開メソッドの定義
101     public void ClearTracks()
102     {
103     m_tracks.Clear();
104     }
105    
106     public void AddTrack(Track track)
107     {
108     m_tracks.Add(track);
109     }
110    
111     public void CreatePipes(int number)
112     {
113     Channel.CreatePipes(number);
114     }
115     #endregion
116    
117     #region 非公開メソッドの定義
118     private void GetSamples()
119     {
120     bool loop = true;
121     int blen = Math.Min((BUFFER_SIZE << 2), m_bufferSize);
122     int offset = 0;
123     int trackIndex = 0;
124     int trackCount = m_tracks.Count;
125     SequencerStep step = SequencerStep.Pre;
126     while (loop)
127     {
128     switch (step)
129     {
130     case SequencerStep.Pre:
131     for (int i = (m_bufferSize << 1) - 1; i >= 0; i--)
132     m_buffer[i] = (0.0).ToShort();
133     if (trackCount > 0)
134     {
135     Track track = m_tracks[Track.TEMPO_TRACK];
136     track.GetSamples(ref m_buffer, 0, m_bufferSize, false);
137     }
138     step = SequencerStep.Track;
139     trackIndex = Track.FIRST_TRACK;
140     offset = 0;
141     break;
142     case SequencerStep.Track:
143     if (trackIndex >= trackCount)
144     step = SequencerStep.Post;
145     else
146     {
147     Track track = m_tracks[trackIndex];
148     track.GetSamples(ref m_buffer, offset, offset + blen, true);
149     offset += blen;
150     if (offset >= m_bufferSize)
151     {
152     offset = 0;
153     trackIndex++;
154     //m_buffered = (m_trackIndex + 1.0) / (trackCount + 1.0);
155     }
156     }
157     break;
158     case SequencerStep.Post:
159     loop = false;
160     break;
161     }
162     }
163     double volume = Math.Min(MasterVolume, 100) / 100;
164     m_stream.Position = 0;
165     for (int i = 0; i < m_bufferSize; i++)
166     {
167     int bufferIndex = i << 1;
168     m_writer.Write((short)(m_buffer[bufferIndex] * volume));
169     m_writer.Write((short)(m_buffer[bufferIndex + 1] * volume));
170     }
171     }
172     #endregion
173    
174     #region 公開プロパティの定義
175     public uint MasterVolume
176     {
177     get;
178     set;
179     }
180     #endregion
181    
182     #region メンバー変数の定義
183     private Dictionary<MediaSampleAttributeKeys, string> m_mediaSampleAttributes;
184     private MediaStreamDescription description;
185     private MemoryStream m_stream;
186     private BinaryWriter m_writer;
187     private List<Track> m_tracks;
188     private short[] m_buffer;
189     private int m_bufferSize;
190     private int m_multiple;
191     private bool m_last;
192     #endregion
193     }
194     }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26