Make recording complain about every little file I/O problem (error on close() failure and fsync() failure). Why? I guess we will find out the disk is full about 1/2 sector sooner on average when the file APIs actually detect this correctly. :/

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13262 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Michael Sevakis 2007-04-25 19:53:34 +00:00
parent 2a2b8d8a82
commit 205ec3279d
6 changed files with 21 additions and 22 deletions

View file

@ -181,13 +181,12 @@ static bool on_end_file(struct enc_file_event_data *data)
hdr.ssnd_size = htobe32(data_size + 8);
if (ci->lseek(data->rec_file, 0, SEEK_SET) != 0 ||
ci->write(data->rec_file, &hdr, sizeof (hdr)) != sizeof (hdr))
ci->write(data->rec_file, &hdr, sizeof (hdr)) != sizeof (hdr) ||
ci->close(data->rec_file) != 0)
{
return false;
}
ci->fsync(data->rec_file);
ci->close(data->rec_file);
data->rec_file = -1;
return true;

View file

@ -2329,11 +2329,9 @@ static bool on_start_file(struct enc_file_event_data *data)
static bool on_end_file(struct enc_file_event_data *data)
{
if (!is_file_data_ok(data))
if (!is_file_data_ok(data) || ci->close(data->rec_file) != 0)
return false;
ci->fsync(data->rec_file);
ci->close(data->rec_file);
data->rec_file = -1;
return true;

View file

@ -169,13 +169,12 @@ static bool on_end_file(struct enc_file_event_data *data)
hdr.data_size = htole32(data_size);
if (ci->lseek(data->rec_file, 0, SEEK_SET) != 0 ||
ci->write(data->rec_file, &hdr, sizeof (hdr)) != sizeof (hdr))
ci->write(data->rec_file, &hdr, sizeof (hdr)) != sizeof (hdr) ||
ci->close(data->rec_file) != 0)
{
return false;
}
ci->fsync(data->rec_file);
ci->close(data->rec_file);
data->rec_file = -1;
return true;

View file

@ -294,13 +294,12 @@ static bool on_end_file(struct enc_file_event_data *data)
ci->write(data->rec_file, &h.wpmdh, sizeof (h.wpmdh))
!= sizeof (h.wpmdh) ||
ci->write(data->rec_file, &h.rhdr, sizeof (h.rhdr))
!= sizeof (h.rhdr))
!= sizeof (h.rhdr) ||
ci->close(data->rec_file) != 0 )
{
return false;
}
ci->fsync(data->rec_file);
ci->close(data->rec_file);
data->rec_file = -1;
return true;

View file

@ -45,15 +45,17 @@
#define PCMREC_E_ENCODER 0x80002000
/* filename queue has desynced from stream markers */
#define PCMREC_E_FNQ_DESYNC 0x80004000
/* I/O error has occurred */
#define PCMREC_E_IO 0x80008000
#ifdef PCMREC_PARANOID
/* encoder has written past end of allotted space */
#define PCMREC_E_CHUNK_OVF 0x80008000
#define PCMREC_E_CHUNK_OVF 0x80010000
/* chunk header incorrect */
#define PCMREC_E_BAD_CHUNK 0x80010000
#define PCMREC_E_BAD_CHUNK 0x80020000
/* encoder read position changed outside of recording control */
#define PCMREC_E_ENC_RD_INDEX_TRASHED 0x80020000
#define PCMREC_E_ENC_RD_INDEX_TRASHED 0x80040000
/* encoder write position changed outside of recording control */
#define PCMREC_E_ENC_WR_INDEX_TRASHED 0x80040000
#define PCMREC_E_ENC_WR_INDEX_TRASHED 0x80080000
#endif /* PCMREC_PARANOID */
/**

View file

@ -653,7 +653,9 @@ static void pcmrec_close_file(int *fd_p)
if (*fd_p < 0)
return; /* preserve error */
close(*fd_p);
if (close(*fd_p) != 0)
errors |= PCMREC_E_IO;
*fd_p = -1;
} /* pcmrec_close_file */
@ -1042,8 +1044,8 @@ static void pcmrec_flush(unsigned flush_num)
} /* end while */
/* sync file */
if (rec_fdata.rec_file >= 0)
fsync(rec_fdata.rec_file);
if (rec_fdata.rec_file >= 0 && fsync(rec_fdata.rec_file) != 0)
errors |= PCMREC_E_IO;
cpu_boost(false);
@ -1239,13 +1241,13 @@ static void pcmrec_init(void)
{
unsigned char *buffer;
pcmrec_close_file(&rec_fdata.rec_file);
rec_fdata.rec_file = -1;
/* warings and errors */
warnings =
errors = 0;
pcmrec_close_file(&rec_fdata.rec_file);
rec_fdata.rec_file = -1;
/* pcm FIFO */
dma_lock = true;
SET_PCM_POS(pcm_rd_pos, 0);