|
일일 결과물 |
조 : 2조 |
조장 : 김윤환 | |
조원 : 박노진, 블라디미르, 신배호, 미스토시 | |
주제 : wav 부분재생 | |
작성일 : 20101124 |
작성자 : 신배호 |
기본 틀
파일을 열었을 때 그에 대한 정보와 주파수를 보여준다.
영역을 선택했을 때
시작위치는 노랑, 끝 위치는 보라색으로 출력해줬다.
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
startX = (int)((double)((double)e.X / (double)pictureBox1.Width)
* (double)w.datachunk.DataChunkSize);
startpoint = e.X;
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
endX = (int)((double)((double)e.X / (double)pictureBox1.Width)
* (double)w.datachunk.DataChunkSize);
endpoint = e.X;
CheckRange();
button2.Enabled = true;
this.Refresh();
}
MouseDown이벤트와 MouseUp이벤트를 이용했고,
private void CheckRange()
{
if (startX > endX)
{
int temp = startX;
startX = endX;
endX = temp;
}
if (startX < 0)
{
startX = 0;
}
if (endX > w.datachunk.DataChunkSize)
{
endX = w.datachunk.DataChunkSize;
}
}
시작점보다 끝점이 작을경우(뒤에서 앞으로) 앞뒤가 바뀌고, 실제 사이즈보다 작거나 큰 위치에 가게 될 경우 0~최대값으로 변경시켜줬다.
public void PlaySound(int x, int y, WavData w)
{
if (filename != null)
{
FileStream f = File.Open(filename, FileMode.Open);
BinaryReader br = new BinaryReader(f);
byte[] buf = br.ReadBytes((int)f.Length);
f.Close();
br.Close();
// 실제 부분만 들어있는 배열
byte[] data = new byte[y - x];
Stream ms2 = new MemoryStream(data);
BinaryWriter bw2 = new BinaryWriter(ms2);
bw2.Write(buf, x, y-x);
byte[] realdata = MakeWaveFormat(data, w);
MemoryStream rms = new MemoryStream(realdata);
try
{
SecondaryBuffer sb = new SecondaryBuffer(rms, device);
sb.Play(0, BufferPlayFlags.Default);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
부분영역의 시작점 x와 끝점 y를 이용해서 처리를 해줬고,
해당 영역만큼 wav형태의 Stream을 재구성해서 플레이시켰다.
private byte[] MakeWaveFormat(byte[] data, WavData w)
{
byte[] buf = new byte[data.Length + 44];
MemoryStream ms = new MemoryStream(buf);
BinaryWriter bw = new BinaryWriter(ms);
bw.Write(0x46464952);
bw.Write(buf.Length);
bw.Write(0x45564157);
bw.Write(0x20746d66);
bw.Write(16);
bw.Write(w.formatchunk.CompressionCode);
bw.Write(w.formatchunk.NumberofChannels);
bw.Write(w.formatchunk.SampleRate);
bw.Write(w.formatchunk.AveragebytesperSecond);
bw.Write(w.formatchunk.BlockAlign);
bw.Write(w.formatchunk.SignificantBitsPerSample);
bw.Write(0x61746164);
bw.Write(data.Length);
bw.Write(data, 0, data.Length);
return buf;
}
재구성 할 때 기존에 있전 정보 WavData를 이용해서 재구성했다.
문제점 – 부분 영역을 선택했을 때 잡음으로 플레이되는 경우가 있다.