summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/export/enc_base.h2
-rw-r--r--firmware/pcm_record.c33
2 files changed, 18 insertions, 17 deletions
diff --git a/firmware/export/enc_base.h b/firmware/export/enc_base.h
index c7c30d66c0..ba8573a4f1 100644
--- a/firmware/export/enc_base.h
+++ b/firmware/export/enc_base.h
@@ -275,8 +275,6 @@ void enc_set_parameters(struct enc_parameters *params);
275struct enc_chunk_hdr * enc_get_chunk(void); 275struct enc_chunk_hdr * enc_get_chunk(void);
276/* releases the current chunk into the available chunks */ 276/* releases the current chunk into the available chunks */
277void enc_finish_chunk(void); 277void enc_finish_chunk(void);
278/* checks near empty state on pcm input buffer */
279int enc_pcm_buf_near_empty(void);
280 278
281#define PCM_MAX_FEED_SIZE 20000 /* max pcm size passed to encoder */ 279#define PCM_MAX_FEED_SIZE 20000 /* max pcm size passed to encoder */
282 280
diff --git a/firmware/pcm_record.c b/firmware/pcm_record.c
index c2d2719d05..1437b438ba 100644
--- a/firmware/pcm_record.c
+++ b/firmware/pcm_record.c
@@ -108,17 +108,16 @@ static unsigned long pre_record_ticks; /* pre-record time in ticks */
108 3.encoder: enc_set_parameters(); set the encoder parameters 108 3.encoder: enc_set_parameters(); set the encoder parameters
109 4.encoder: enc_get_pcm_data(); get n bytes of unprocessed pcm data 109 4.encoder: enc_get_pcm_data(); get n bytes of unprocessed pcm data
110 5.encoder: enc_unget_pcm_data(); put n bytes of data back (optional) 110 5.encoder: enc_unget_pcm_data(); put n bytes of data back (optional)
111 6.encoder: enc_pcm_buf_near_empty(); if !0: reduce cpu_boost 111 6.encoder: enc_get_chunk(); get a ptr to next enc chunk
112 7.encoder: enc_get_chunk(); get a ptr to next enc chunk 112 7.encoder: <process enc chunk> compress and store data to enc chunk
113 8.encoder: <process enc chunk> compress and store data to enc chunk 113 8.encoder: enc_finish_chunk(); inform main about chunk processed and
114 9.encoder: enc_finish_chunk(); inform main about chunk processed and
115 is available to be written to a file. 114 is available to be written to a file.
116 Encoder can place any number of chunks 115 Encoder can place any number of chunks
117 of PCM data in a single output chunk 116 of PCM data in a single output chunk
118 but must stay within its output chunk 117 but must stay within its output chunk
119 size 118 size
120 A.encoder: repeat 4. to 9. 119 9.encoder: repeat 4. to 8.
121 B.pcmrec: enc_events_callback(); called for certain events 120 A.pcmrec: enc_events_callback(); called for certain events
122 121
123 (*) Optional step 122 (*) Optional step
124****************************************************************************/ 123****************************************************************************/
@@ -1541,6 +1540,7 @@ void enc_set_parameters(struct enc_parameters *params)
1541 /* Encoder is terminating */ 1540 /* Encoder is terminating */
1542 memset(&enc_config, 0, sizeof (enc_config)); 1541 memset(&enc_config, 0, sizeof (enc_config));
1543 enc_sample_rate = 0; 1542 enc_sample_rate = 0;
1543 cancel_cpu_boost(); /* Make sure no boost remains */
1544 return; 1544 return;
1545 } 1545 }
1546 1546
@@ -1709,15 +1709,6 @@ void enc_finish_chunk(void)
1709 } 1709 }
1710} /* enc_finish_chunk */ 1710} /* enc_finish_chunk */
1711 1711
1712/* checks near empty state on pcm input buffer */
1713int enc_pcm_buf_near_empty(void)
1714{
1715 /* less than 1sec raw data? => unboost encoder */
1716 int wp = dma_wr_pos;
1717 size_t avail = (wp - pcm_rd_pos) & PCM_CHUNK_MASK;
1718 return avail < (sample_rate << 2) ? 1 : 0;
1719} /* enc_pcm_buf_near_empty */
1720
1721/* passes a pointer to next chunk of unprocessed wav data */ 1712/* passes a pointer to next chunk of unprocessed wav data */
1722/* TODO: this really should give the actual size returned */ 1713/* TODO: this really should give the actual size returned */
1723unsigned char * enc_get_pcm_data(size_t size) 1714unsigned char * enc_get_pcm_data(size_t size)
@@ -1744,12 +1735,24 @@ unsigned char * enc_get_pcm_data(size_t size)
1744 pcm_buffer, pcm_rd_pos); 1735 pcm_buffer, pcm_rd_pos);
1745 } 1736 }
1746 1737
1738 if (avail >= (sample_rate << 2))
1739 {
1740 /* Filling up - boost codec */
1741 trigger_cpu_boost();
1742 }
1743
1747 pcm_buffer_empty = false; 1744 pcm_buffer_empty = false;
1748 return ptr; 1745 return ptr;
1749 } 1746 }
1750 1747
1751 /* not enough data available - encoder should idle */ 1748 /* not enough data available - encoder should idle */
1752 pcm_buffer_empty = true; 1749 pcm_buffer_empty = true;
1750
1751 cancel_cpu_boost();
1752
1753 /* Sleep long enough to allow one frame on average */
1754 sleep(0);
1755
1753 return NULL; 1756 return NULL;
1754} /* enc_get_pcm_data */ 1757} /* enc_get_pcm_data */
1755 1758