diff --git a/src/dsf.c b/src/dsf.c
index 2f17c8d..3b68364 100644
--- a/src/dsf.c
+++ b/src/dsf.c
@@ -221,7 +221,7 @@ static int dsf_writeheader(sox_format_t *ft)
 	    lsx_writedw(ft, dsf->chan_num) ||
 	    lsx_writedw(ft, dsf->sfreq) ||
 	    lsx_writedw(ft, dsf->bps) ||
-	    lsx_writeqw(ft, dsf->scount) ||
+	    lsx_writeqw(ft, dsf->scount ? dsf->scount : UINT64_MAX) ||
 	    lsx_writedw(ft, dsf->block_size) ||
 	    lsx_writedw(ft, 0) || /* reserved */
 	    lsx_writedw(ft, DATA_TAG) ||
@@ -259,7 +259,10 @@ static int dsf_write_buf(sox_format_t *ft)
 		if (lsx_write_b_buf(ft, dsf->block, wlen) < wlen)
 			return SOX_EOF;
 		dsf->block_pos = 0;
-		memset(dsf->block, 0, wlen);
+		if (ft->seekable)
+			memset(dsf->block, 0, wlen);
+		else
+			memset(dsf->block, 0x69, wlen);
 	}
 
 	return SOX_SUCCESS;
@@ -275,7 +278,10 @@ static void dsf_write_bits(struct dsf *dsf, const sox_sample_t *buf,
 		unsigned d = dsd[i * dsf->block_size];
 
 		for (j = start_bit; j < start_bit + len; j++) {
-			d |= (buf[i + j * dsf->chan_num] > 0) << j;
+			if (buf[i + j * dsf->chan_num] > 0)
+				d |= 1 << j;
+			else
+				d &= ~(1 << j);
 		}
 
 		dsd[i * dsf->block_size] = d;
