Cześć, używam NAudio. Mam plik dźwiękowy. Chcę wyciąć jego fragment. Robię to w następujący sposób:
- Kopiuję część pliku przed wycięciem do nowego streama
- Kopiuję część pliku po wycięciu dalej do nowego streama(z punktu 1)
- Zapisuję
- Zamykam dwa streamy(oryginalny i nowy)
- Kopiję nowy plik w miejsce starego
- Usuwam plik tymczasowy(który został skopiowany w punkcie 5).
Za pierwszym razem działa ok. Jednak, jak chcę wyciąć drugi fragment w tym samym pliku, dostaję błąd, że:
"is being used by another process." - odnosi się do pliku oryginalnego - błąd podczas kopiowania. Mój kod:
public void CutSelection(string fileName)
{
//pobieram czas początku i końca zaznaczenia
TimeSpan startTime = GetSelectionStartTime();
TimeSpan endTime = GetSelectionEndTime();
//zamieniam te czasy na odpowiednie bajty - pozycja
int bytesPerMilisecond = waveStream.WaveFormat.AverageBytesPerSecond / 1000;
int startPos = (int)startTime.TotalMilliseconds * bytesPerMilisecond;
startPos = startPos - startPos % waveStream.WaveFormat.BlockAlign;
int endPos = (int)endTime.TotalMilliseconds * bytesPerMilisecond;
endPos = endPos - endPos % waveStream.WaveFormat.BlockAlign;
//tworzę sobie nowy plik o nazwie kończącej się "_"
using (WaveFileWriter writer = new WaveFileWriter(fileName+"_", waveStream.WaveFormat))
{
byte[] buffer = new byte[1024];
int bytesRead = 0;
int bytesRequired = 0;
//przed
waveStream.Position = 0;
while (waveStream.Position < startPos)
{
bytesRequired = (int)(startPos - waveStream.Position);
if (bytesRequired > 1024)
bytesRequired = 1024;
bytesRead = waveStream.Read(buffer, 0, bytesRequired);
writer.Write(buffer, 0, bytesRead);
}
//po
waveStream.Position = endPos;
while (waveStream.Position < waveStream.Length)
{
bytesRequired = (int)(waveStream.Length - waveStream.Position);
if (bytesRequired > 1024)
bytesRequired = 1024;
bytesRead = waveStream.Read(buffer, 0, bytesRequired);
writer.Write(buffer, 0, bytesRead);
}
}//using
//zamykam oryginalny plik(fileName)
waveStream.Close();
waveStream.Dispose();
waveStream = null;
//kopiuję nowy plik w miejsce oryginalnego - tu mam błąd przy drugim razie. Błąd dotyczy fileName - czyli oryginalnego pliku
File.Copy(fileName + "_", fileName, true);
//usuwam plik tymczasowy
File.Delete(fileName + "_");
//tworzę główny waveStream z nowego pliku
waveStream = new WaveFileReader(fileName);
}
Ten błąd jest dla mnie niepojęty. Dlaczego wyskakuje, skoro zwalniam cały waveStream?