Reputation: 1218
This is my code for recording sound in temporary file. when i record sound and then listen to playback, everything goes well, but when i click again on playback button, i get this error:
How can i solve this problem?
Code:
using System.Collections.Generic;
using System.IO;
using System.IO.IsolatedStorage;
using System.Windows;
using System.Windows.Controls;
using Coding4Fun.Toolkit.Audio;
using Coding4Fun.Toolkit.Audio.Helpers;
namespace AudioRecorder.UserControls
{
public partial class SoundRecorderPanel : UserControl
{
private MicrophoneRecorder _recorder = new MicrophoneRecorder();
private List<IsolatedStorageFileStream> _audioList = new List<IsolatedStorageFileStream>();
private int _counter;
public SoundRecorderPanel()
{
InitializeComponent();
}
private void ButtonRecord_OnChecked(object sender, RoutedEventArgs e)
{
_recorder.Start();
}
private void ButtonRecord_OnUnchecked(object sender, RoutedEventArgs e)
{
_recorder.Stop();
SaveTempAudio(_recorder.Buffer);
}
private void SaveTempAudio(MemoryStream buffer)
{
if (_counter==2)
return;
using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
var bytes = buffer.GetWavAsByteArray(_recorder.SampleRate);
var tempFileName = "tempwaveFile_"+_counter;
IsolatedStorageFileStream audioStream = isoStore.CreateFile(tempFileName);
audioStream.Write(bytes,0,bytes.Length);
_audioList.Add(audioStream);
_counter++;
}
}
private void ButtonPlayBack_OnClick(object sender, RoutedEventArgs e)
{
var index = int.Parse(((Button) sender).Tag.ToString());
var audioPlayer = new MediaElement {AutoPlay = true};
if (index < _audioList.Count)
{
audioPlayer.SetSource(_audioList[index]);
LayoutRoot.Children.Add(audioPlayer);
audioPlayer.Play();
}
}
}
}
Upvotes: 2
Views: 236
Reputation: 280
You can 100% use a using block. Issue was how you were attempting to access the stream in the separate event. Reopen it rather than attempt to save a reference in an index to the stream.
using (var stream = new IsolatedStorageFileStream(_fileName, FileMode.Open, storageFolder))
{
playBack.SetSource(stream);
playBack.Play();
}
Use the sample code: https://coding4fun.codeplex.com/SourceControl/latest#source/Coding4Fun.Toolkit.Test.WindowsPhone.Common/Samples/Audio.xaml.cs
Upvotes: 1
Reputation: 1218
I solved my problem , it's weird but it seems using(){} does not work ! and i disposed IsolatedStorageFile and IsolatedStorageFileStream manually . and also i changed the code under ButtonPlayBack click event . this is my new code for someone who has a same problem .
private void SaveTempAudio(MemoryStream buffer)
{
if (_counter == 2)
return;
var isoStore = IsolatedStorageFile.GetUserStoreForApplication();
var bytes = buffer.GetWavAsByteArray(_recorder.SampleRate);
var tempFileName = "tempwave_" + _counter;
var audioStream = isoStore.CreateFile(tempFileName);
audioStream.Write(bytes, 0, bytes.Length);
_audioList.Add(audioStream);
_counter++;
isoStore.Dispose();
audioStream.Close();
audioStream.Dispose();
}
private void ButtonPlayBack_OnClick(object sender, RoutedEventArgs e)
{
var index = int.Parse(((Button) sender).Tag.ToString());
var fileName = "tempwave_" + ((Button) sender).Tag;
if (index >= _audioList.Count)
return;
var isoStorage = IsolatedStorageFile.GetUserStoreForApplication();
var fileStream = isoStorage.OpenFile(fileName, FileMode.Open, FileAccess.Read);
SoundPlayer.SetSource(fileStream);
SoundPlayer.Play();
isoStorage.Dispose();
fileStream.Close();
fileStream.Dispose();
}
Upvotes: 0