diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/export/enc_base.h | 2 | ||||
-rw-r--r-- | firmware/pcm_record.c | 33 |
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); | |||
275 | struct enc_chunk_hdr * enc_get_chunk(void); | 275 | struct 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 */ |
277 | void enc_finish_chunk(void); | 277 | void enc_finish_chunk(void); |
278 | /* checks near empty state on pcm input buffer */ | ||
279 | int 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 */ | ||
1713 | int 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 */ |
1723 | unsigned char * enc_get_pcm_data(size_t size) | 1714 | unsigned 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 | ||