Compare commits

...
Sign in to create a new pull request.

33 commits
master ... v3.9

Author SHA1 Message Date
Alex Parker
0f1b77dae8 Backport r30323/r30169 - perl use if/elsif/else so that it'll build with both new and old perl.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30406 a1c6a512-1295-4272-9138-f99709370657
2011-09-01 14:25:05 +00:00
Alex Parker
7eef227154 Bump release date for 3.9.1, better late than never.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30405 a1c6a512-1295-4272-9138-f99709370657
2011-09-01 13:41:23 +00:00
Thomas Martitz
bddea666f5 Fix FS#12239, data abort after going from FMS to WPS.
The data abort was in find_handle() because current_handle was corrupted. This
most probably happened due to the FMS allocating Radio AA on the buffer without
resetting the buffer, corrupting buffering/playback state.

The fix is to grab buffer control explicitely.

r30308 isn't actually related, regardless of the task title.

git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30343 a1c6a512-1295-4272-9138-f99709370657
2011-08-24 07:02:29 +00:00
Frank Gevaerts
ed0198a7c2 Add a 100ms delay before calling disk_mount_all(). Some players (especially some gigabeat Fs) seem to need a delay after disabling USB if we want disk access to work.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30317 a1c6a512-1295-4272-9138-f99709370657
2011-08-15 14:38:44 +00:00
Alex Parker
f16bb13271 Bump versions for 3.9.1
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30295 a1c6a512-1295-4272-9138-f99709370657
2011-08-14 10:30:13 +00:00
Andree Buschmann
18db18c34d Backport r30259: Fix replaygain for wma files.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30260 a1c6a512-1295-4272-9138-f99709370657
2011-08-06 09:24:23 +00:00
Michael Hohmuth
1bb1052925 Database: Bug fix: The filename seek index is invalid if FLAG_DIRCACHE
is set on a database entry and the dircache went offline.  In this
case, retrieve() and get_next() need to abort and take the ramcache
offline as well.

git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30257 a1c6a512-1295-4272-9138-f99709370657
2011-08-04 23:22:26 +00:00
Michael Hohmuth
211c082d91 Database: find_entry_ram: Avoid dircache use if it's not ready
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30256 a1c6a512-1295-4272-9138-f99709370657
2011-08-04 23:22:15 +00:00
Michael Hohmuth
3049a6bd04 Database: Fixed a potential buffer overrun in format_str. From
FS#12132 patch 8.

git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30252 a1c6a512-1295-4272-9138-f99709370657
2011-08-04 12:13:16 +00:00
Michael Hohmuth
6196925915 Database: Fix array-bounds calculation when applying a format using
%strip to partially loaded (chunked) database results.

git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30251 a1c6a512-1295-4272-9138-f99709370657
2011-08-04 12:13:12 +00:00
Michael Hohmuth
92a578c6a7 Database: Fix memory-area bounds checking during database reload.
Check free space before reading new data from disk, and do not forget
to account for the RAM-cache header.

git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30250 a1c6a512-1295-4272-9138-f99709370657
2011-08-04 12:13:02 +00:00
Magnus Holmgren
e6d21f1d10 Backport r30149 (AAC gapless fix) to 3.9 branch.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30245 a1c6a512-1295-4272-9138-f99709370657
2011-08-03 18:35:24 +00:00
Frank Gevaerts
dfafd22ec5 Lower the maximum brightness of the fuzev2 backlight even more.
The previous maximum (20) still causes excessive heat for some people, and measurements (using a digital camera and a white screen) show that the maximum brightness in the OF corresponds to 12 in rockbox, so we use 12 now.



git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30228 a1c6a512-1295-4272-9138-f99709370657
2011-07-31 15:33:57 +00:00
Andree Buschmann
be32b990f8 Backport r30202. Fixes musepack resume for resume positions > 7:30m.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30203 a1c6a512-1295-4272-9138-f99709370657
2011-07-23 21:05:47 +00:00
Mustapha Senhaji
09885c3403 Update the french translation, shorten string for Archos Player.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30129 a1c6a512-1295-4272-9138-f99709370657
2011-07-06 20:45:23 +00:00
Mustapha Senhaji
0965f79bc1 FS#12173 Romanian translation update by Sergiu Rotaru.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30127 a1c6a512-1295-4272-9138-f99709370657
2011-07-06 20:34:30 +00:00
Bertrik Sikken
73ffc047e8 FS#12172 - Update for serbian translation by Ivan Pesic
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30095 a1c6a512-1295-4272-9138-f99709370657
2011-06-28 21:19:12 +00:00
Bertrik Sikken
919697d3b2 FS#12171 - Polish translation update by Wojciech Lesniak
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30092 a1c6a512-1295-4272-9138-f99709370657
2011-06-28 21:07:30 +00:00
Jonas Häggqvist
583ac1c708 Update Danish translation
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30083 a1c6a512-1295-4272-9138-f99709370657
2011-06-27 12:11:35 +00:00
Michael Chicoine
7af20f70e0 FS#12168 - Update Simp Chinese translation by Li Jie
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30082 a1c6a512-1295-4272-9138-f99709370657
2011-06-26 20:21:10 +00:00
Bertrik Sikken
7e209cd739 Fix missing strings in nederlands translation
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30079 a1c6a512-1295-4272-9138-f99709370657
2011-06-26 12:23:36 +00:00
Jens Arnold
c709aedb9a Update US English translation
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30077 a1c6a512-1295-4272-9138-f99709370657
2011-06-26 11:18:21 +00:00
Jens Arnold
28cff95ffc Update German translation
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30076 a1c6a512-1295-4272-9138-f99709370657
2011-06-26 11:18:10 +00:00
Alex Parker
b9c407a918 Bump versions for release.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30073 a1c6a512-1295-4272-9138-f99709370657
2011-06-26 10:52:00 +00:00
Jens Arnold
1a3d05eae9 (Heavily) shorten the .lang string shown when generating the database
for the Player in order to make it fit on the small LCD.


git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30067 a1c6a512-1295-4272-9138-f99709370657
2011-06-25 00:01:37 +00:00
Michael Sevakis
66fee3eb55 Backport r30063 to the v3.9 branch. SPC Codec: Restore correct FIR buffer alignment when an address mask is used. It must be FIR_BUF_ALIGN. Fix Coldfire assembly constraint where an input parameter was also being written.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30064 a1c6a512-1295-4272-9138-f99709370657
2011-06-24 11:52:17 +00:00
Andree Buschmann
6472bcde65 Backport r30052 to v3.9 branch. Fixes build problems for win32 cross compilation and cygwin.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30062 a1c6a512-1295-4272-9138-f99709370657
2011-06-24 10:00:06 +00:00
Andree Buschmann
3562e0fb1f Backport r30060 to v3.9 branch. Fixes a possible RealAudio decoder failure.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30061 a1c6a512-1295-4272-9138-f99709370657
2011-06-24 09:29:25 +00:00
Miika Pekkarinen
d348615dee Fixed a regression caused in r30021: tagnavi_custom.config parsing
fails if lines ended with <CR><LF> sequence.


git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30059 a1c6a512-1295-4272-9138-f99709370657
2011-06-23 21:27:08 +00:00
Alex Parker
27cdcb61bf Update US English by Steven Panek.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30046 a1c6a512-1295-4272-9138-f99709370657
2011-06-20 21:14:44 +00:00
Alex Parker
3b1926a8d5 Add US English by Steven Panek.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30042 a1c6a512-1295-4272-9138-f99709370657
2011-06-20 20:21:55 +00:00
Alex Parker
36e309cbe7 Bump release scripts to 3.9RC
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30023 a1c6a512-1295-4272-9138-f99709370657
2011-06-20 17:32:25 +00:00
Alex Parker
f2e123efd5 Branch for 3.9
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_9@30022 a1c6a512-1295-4272-9138-f99709370657
2011-06-20 17:20:13 +00:00
33 changed files with 13051 additions and 239 deletions

View file

@ -61,6 +61,7 @@ enum codec_status codec_run(void)
int file_offset;
int framelength;
int lead_trim = 0;
unsigned int frame_samples;
unsigned int i;
unsigned char* buffer;
NeAACDecFrameInfo frame_info;
@ -214,13 +215,15 @@ enum codec_status codec_run(void)
/* Output the audio */
ci->yield();
frame_samples = frame_info.samples >> 1;
if (empty_first_frame)
{
/* Remove the first frame from lead_trim, under the assumption
* that it had the same size as this frame
*/
empty_first_frame = false;
lead_trim -= (frame_info.samples >> 1);
lead_trim -= frame_samples;
if (lead_trim < 0)
{
@ -229,11 +232,30 @@ enum codec_status codec_run(void)
}
/* Gather number of samples for the decoded frame. */
framelength = (frame_info.samples >> 1) - lead_trim;
framelength = frame_samples - lead_trim;
if (i == demux_res.num_sample_byte_sizes - 1)
{
framelength -= ci->id3->tail_trim;
// Size of the last frame
const uint32_t sample_duration = (demux_res.num_time_to_samples > 0) ?
demux_res.time_to_sample[demux_res.num_time_to_samples - 1].sample_duration :
frame_samples;
/* Currently limited to at most one frame of tail_trim.
* Seems to be enough.
*/
if (ci->id3->tail_trim == 0 && sample_duration < frame_samples)
{
/* Subtract lead_trim just in case we decode a file with only
* one audio frame with actual data (lead_trim is usually zero
* here).
*/
framelength = sample_duration - lead_trim;
}
else
{
framelength -= ci->id3->tail_trim;
}
}
if (framelength > 0)
@ -241,6 +263,10 @@ enum codec_status codec_run(void)
ci->pcmbuf_insert(&decoder->time_out[0][lead_trim],
&decoder->time_out[1][lead_trim],
framelength);
sound_samples_done += framelength;
/* Update the elapsed-time indicator */
elapsed_time = (sound_samples_done * 10) / (ci->id3->frequency / 100);
ci->set_elapsed(elapsed_time);
}
if (lead_trim > 0)
@ -253,7 +279,7 @@ enum codec_status codec_run(void)
empty_first_frame = true;
}
lead_trim -= (frame_info.samples >> 1);
lead_trim -= frame_samples;
if (lead_trim < 0)
{
@ -261,11 +287,7 @@ enum codec_status codec_run(void)
}
}
/* Update the elapsed-time indicator */
sound_samples_done += framelength;
elapsed_time = (sound_samples_done * 10) / (ci->id3->frequency / 100);
ci->set_elapsed(elapsed_time);
i++;
++i;
}
LOGF("AAC: Decoded %lu samples\n", (unsigned long)sound_samples_done);

View file

@ -89,7 +89,7 @@ enum codec_status codec_run(void)
fs = rmctx.audio_framesize;
sps= rmctx.block_align;
h = rmctx.sub_packet_h;
scrambling_unit_size = h*fs;
scrambling_unit_size = h * (fs + PACKET_HEADER_SIZE);
res = atrac3_decode_init(&q, ci->id3);
if(res < 0) {

View file

@ -88,7 +88,7 @@ enum codec_status codec_run(void)
fs = rmctx.audio_framesize;
sps= rmctx.block_align;
h = rmctx.sub_packet_h;
scrambling_unit_size = h*fs;
scrambling_unit_size = h * (fs + PACKET_HEADER_SIZE);
res =cook_decode_init(&rmctx, &q);
if(res < 0) {

View file

@ -541,8 +541,9 @@ int rm_get_packet(uint8_t **src,RMContext *rmctx, RMPacket *pkt)
if (!y)
rmctx->audiotimestamp = pkt->timestamp;
advance_buffer(src,12);
consumed += 12;
/* Skip packet header */
advance_buffer(src, PACKET_HEADER_SIZE);
consumed += PACKET_HEADER_SIZE;
if (rmctx->codec_type == CODEC_COOK || rmctx->codec_type == CODEC_ATRAC) {
for(x = 0 ; x < w/sps; x++)
{

View file

@ -28,7 +28,8 @@
#include "spc_profiler.h"
#if defined(CPU_COLDFIRE) || defined (CPU_ARM)
int32_t fir_buf[FIR_BUF_CNT] IBSS_ATTR_SPC MEM_ALIGN_ATTR;
int32_t fir_buf[FIR_BUF_CNT] IBSS_ATTR_SPC
__attribute__((aligned(FIR_BUF_ALIGN*1)));
#endif
#if SPC_BRRCACHE
/* a little extra for samples that go past end */
@ -1276,6 +1277,8 @@ void DSP_run_( struct Spc_Dsp* this, long count, int32_t* out_buf )
/* Feedback into echo buffer */
if ( !(this->r.g.flags & 0x20) )
{
int sh = 1 << 9;
asm volatile (
/* scale echo voices; saturate if overflow */
"mac.l %[sh], %[e1] , %%acc1 \r\n"
@ -1298,11 +1301,10 @@ void DSP_run_( struct Spc_Dsp* this, long count, int32_t* out_buf )
"or.l %[sh], %[e0] \r\n"
/* save final feedback into echo buffer */
"move.l %[e0], (%[echo_ptr]) \r\n"
: [e0]"+d"(echo_0), [e1]"+d"(echo_1)
: [e0]"+d"(echo_0), [e1]"+d"(echo_1), [sh]"+d"(sh)
: [out_0]"r"(out_0), [out_1]"r"(out_1),
[ef]"r"((int)this->r.g.echo_feedback),
[echo_ptr]"a"((int32_t *)echo_ptr),
[sh]"d"(1 << 9)
[echo_ptr]"a"((int32_t *)echo_ptr)
);
}

View file

@ -108,7 +108,7 @@ enum codec_status codec_run(void)
* sample seek position from the file offset, the sampling frequency and
* the bitrate. As the saved position is exactly calculated the reverse way
* there is no loss of information except rounding. */
samplesdone = 100 * ((mpc_uint64_t)(ci->id3->offset * frequency) / byterate);
samplesdone = 100 * (((mpc_uint64_t)ci->id3->offset * frequency) / byterate);
/* Set up digital signal processing for correct number of channels */
/* NOTE: current musepack format only allows for stereo files

View file

@ -6,6 +6,7 @@ dansk.lang
deutsch.lang
eesti.lang
english.lang
english-us.lang
espanol.lang
esperanto.lang
finnish.lang

View file

@ -8018,6 +8018,7 @@
iaudiox5,iaudiom5,gigabeat*,mrobe100: "Building database... %d found (LEFT to return)"
iriverh10,iriverh10_5gb,sansae200*,sansac200*,sansafuze*,vibe500: "Building database... %d found (PREV to return)"
gogearsa9200: "Building database... %d found (REW to return)"
archosplayer: "Building DB %d found"
</source>
<dest>
*: "数据库更新中...已找到%d个(按OFF键返回)"
@ -8026,6 +8027,7 @@
iaudiox5,iaudiom5,gigabeat*,mrobe100: "数据库更新中...已找到%d个(按LEFT键返回)"
iriverh10,iriverh10_5gb,sansae200*,sansac200*,sansafuze*,vibe500: "数据库更新中...已找到%d个(按PREV键返回)"
gogearsa9200: "数据库更新中...已找到%d个(按REW键返回)"
archosplayer: "数据库更新中...已找到%d个"
</dest>
<voice>
*: "数据库更新中"
@ -9244,19 +9246,16 @@
</phrase>
<phrase>
id: LANG_HEADPHONE_UNPLUG_RW
desc: in pause_phones_menu.
desc: deprecated
user: core
<source>
*: none
headphone_detection: "Duration to Rewind"
*: ""
</source>
<dest>
*: none
headphone_detection: "倒回长度"
*: ""
</dest>
<voice>
*: none
headphone_detection: "倒回长度"
*: ""
</voice>
</phrase>
<phrase>
@ -12645,19 +12644,33 @@
</voice>
</phrase>
<phrase>
id: LANG_RECORDING_HISTOGRAM_INTERVAL
id: LANG_PAUSE_REWIND
desc: Seconds to rewind when rewind on pause is enabled.
user: core
<source>
*: "Rewind on Pause"
</source>
<dest>
*: "暂停后倒回"
</dest>
<voice>
*: "暂停后倒回"
</voice>
</phrase>
<phrase>
id: LANG_HISTOGRAM_INTERVAL
desc: in record settings menu
user: core
<source>
*: none
recording_histogram: "Histogram interval"
histogram: "Histogram interval"
</source>
<dest>
*: none
recording_histogram: "柱状图间隔"
histogram: "直方图区间"
</dest>
<voice>
*: none
recording_histogram: "柱状图间隔"
histogram: "直方图区间"
</voice>
</phrase>

View file

@ -8400,6 +8400,7 @@
iaudiox5,iaudiom5,gigabeat*,mrobe100: "Building database... %d found (LEFT to return)"
iriverh10,iriverh10_5gb,sansae200*,sansac200*,sansafuze*,vibe500: "Building database... %d found (PREV to return)"
gogearsa9200: "Building database... %d found (REW to return)"
archosplayer: "Building DB %d found"
</source>
<dest>
*: "Bygger database... %d fundet (SLUK for at stoppe)"
@ -8408,13 +8409,10 @@
iaudiox5,iaudiom5,gigabeat*,mrobe100: "Bygger database... %d fundet (VENSTRE for at stoppe)"
iriverh10,iriverh10_5gb,sansae200*,sansac200*,sansafuze*,vibe500: "Bygger database... %d fundet (FORRIGE for at stoppe)"
gogearsa9200: "Bygger database... %d fundet (SPOL TILBAGE for at stoppe)"
archosplayer: "Bygger DB %d fundet"
</dest>
<voice>
*: "filer fundet til databasen"
iriverh100,iriverh120,iriverh300: ""
ipod*: ""
iaudiox5,iaudiom5,gigabeat*,mrobe100: ""
iriverh10,iriverh10_5gb,sansae200*,sansac200*,gogearsa9200: ""
</voice>
</phrase>
<phrase>
@ -9885,19 +9883,16 @@
</phrase>
<phrase>
id: LANG_HEADPHONE_UNPLUG_RW
desc: in pause_phones_menu.
desc: deprecated
user: core
<source>
*: none
headphone_detection: "Duration to Rewind"
*: ""
</source>
<dest>
*: none
headphone_detection: "Spol tilbage"
*: ""
</dest>
<voice>
*: none
headphone_detection: "Spol tilbage"
*: ""
</voice>
</phrase>
<phrase>
@ -12683,3 +12678,17 @@
*: "Kun i brugerdefinerede mapper"
</voice>
</phrase>
<phrase>
id: LANG_PAUSE_REWIND
desc: Seconds to rewind when rewind on pause is enabled.
user: core
<source>
*: "Rewind on Pause"
</source>
<dest>
*: "Spol tilbage ved pause"
</dest>
<voice>
*: "Spol tilbage ved pause"
</voice>
</phrase>

View file

@ -1986,19 +1986,16 @@
</phrase>
<phrase>
id: LANG_HEADPHONE_UNPLUG_RW
desc: in pause_phones_menu.
desc: deprecated
user: core
<source>
*: none
headphone_detection: "Duration to Rewind"
*: ""
</source>
<dest>
*: none
headphone_detection: "Rücklaufdauer"
*: ""
</dest>
<voice>
*: none
headphone_detection: "Rücklaufdauer"
*: ""
</voice>
</phrase>
<phrase>
@ -2239,6 +2236,7 @@
iaudiox5,iaudiom5,gigabeat*,mrobe100: "Building database... %d found (LEFT to return)"
iriverh10,iriverh10_5gb,sansae200*,sansac200*,sansafuze*,vibe500: "Building database... %d found (PREV to return)"
gogearsa9200: "Building database... %d found (REW to return)"
archosplayer: "Building DB %d found"
</source>
<dest>
*: "Erstelle Datenbank... %d gefunden (OFF zum Abbrechen)"
@ -2247,6 +2245,7 @@
iaudiox5,iaudiom5,gigabeat*,mrobe100: "Erstelle Datenbank... %d gefunden (LEFT zum Abbrechen)"
iriverh10,iriverh10_5gb,sansae200*,sansac200*,sansafuze*,vibe500: "Erstelle Datenbank... %d gefunden (PREV zum Abbrechen)"
gogearsa9200: "Erstelle Datenbank... %d gefunden (REW zum Abbrechen)"
archosplayer: "Erstelle DB %d gefu."
</dest>
<voice>
*: "Erstelle Datenbank"
@ -12678,3 +12677,17 @@
*: "Nur in bestimmten Verzeichnissen"
</voice>
</phrase>
<phrase>
id: LANG_PAUSE_REWIND
desc: Seconds to rewind when rewind on pause is enabled.
user: core
<source>
*: "Rewind on Pause"
</source>
<dest>
*: "Zurückspulen bei Pause"
</dest>
<voice>
*: "Zurückspulen bei Pause"
</voice>
</phrase>

12676
apps/lang/english-us.lang Normal file

File diff suppressed because it is too large Load diff

View file

@ -2319,6 +2319,7 @@
iaudiox5,iaudiom5,gigabeat*,mrobe100: "Building database... %d found (LEFT to return)"
iriverh10,iriverh10_5gb,sansae200*,sansac200*,sansafuze*,vibe500: "Building database... %d found (PREV to return)"
gogearsa9200: "Building database... %d found (REW to return)"
archosplayer: "Building DB %d found"
</source>
<dest>
*: "Building database... %d found (OFF to return)"
@ -2327,6 +2328,7 @@
iaudiox5,iaudiom5,gigabeat*,mrobe100: "Building database... %d found (LEFT to return)"
iriverh10,iriverh10_5gb,sansae200*,sansac200*,sansafuze*,vibe500: "Building database... %d found (PREV to return)"
gogearsa9200: "Building database... %d found (REW to return)"
archosplayer: "Building DB %d found"
</dest>
<voice>
*: "entries found for database"

View file

@ -2262,6 +2262,7 @@
iaudiox5,iaudiom5,gigabeat*,mrobe100: "Building database... %d found (LEFT to return)"
iriverh10,iriverh10_5gb,sansae200*,sansac200*,sansafuze*,vibe500: "Building database... %d found (PREV to return)"
gogearsa9200: "Building database... %d found (REW to return)"
archosplayer: "Building DB %d found"
</source>
<dest>
*: "Création base de données... %d trouvés (OFF = retour)"
@ -2270,6 +2271,7 @@
iaudiox5,iaudiom5,gigabeat*,mrobe100: "Création base de données... %d trouvés (LEFT = retour)"
iriverh10,iriverh10_5gb,sansae200*,sansac200*,sansafuze*,vibe500: "Création base de données... %d trouvés (PREV = retour)"
gogearsa9200: "Création base de données... %d trouvés (REW = retour)"
archosplayer: "Création BD %d trouvés"
</dest>
<voice>
*: "entrées trouvées pour base de données"

View file

@ -9035,6 +9035,7 @@
iaudiox5,iaudiom5,gigabeat*,mrobe100: "Building database... %d found (LEFT to return)"
iriverh10,iriverh10_5gb,sansae200*,sansac200*,sansafuze*,vibe500: "Building database... %d found (PREV to return)"
gogearsa9200: "Building database... %d found (REW to return)"
archosplayer: "Building DB %d found"
</source>
<dest>
*: "Aanmaken van database... %d gevonden (OFF = terug)"
@ -9043,6 +9044,7 @@
iaudiox5,iaudiom5,gigabeat*,mrobe100: "Aanmaken van database... %d gevonden (LINKS = terug)"
iriverh10,iriverh10_5gb,sansae200*,sansac200*,sansafuze*,vibe500: "Aanmaken van database... %d gevonden (PREV = terug)"
gogearsa9200: "Aanmaken van database... %d gevonden (REW = terug)"
archosplayer: "Aanmaken DB %d gev."
</dest>
<voice>
*: "Aanmaken van database"
@ -9824,19 +9826,16 @@
</phrase>
<phrase>
id: LANG_HEADPHONE_UNPLUG_RW
desc: in pause_phones_menu.
desc: deprecated
user: core
<source>
*: none
headphone_detection: "Duration to Rewind"
*: ""
</source>
<dest>
*: none
headphone_detection: "Terug te springen tijd"
*: ""
</dest>
<voice>
*: none
headphone_detection: "Terug te springen tijd"
*: ""
</voice>
</phrase>
<phrase>
@ -12664,3 +12663,17 @@
*: "Alleen in bepaalde mappen"
</voice>
</phrase>
<phrase>
id: LANG_PAUSE_REWIND
desc: Seconds to rewind when rewind on pause is enabled.
user: core
<source>
*: "Rewind on Pause"
</source>
<dest>
*: "Terugspoelen bij pauzeren"
</dest>
<voice>
*: "Terugspoelen bij pauzeren"
</voice>
</phrase>

View file

@ -1992,19 +1992,16 @@
</phrase>
<phrase>
id: LANG_HEADPHONE_UNPLUG_RW
desc: in pause_phones_menu.
desc: deprecated
user: core
<source>
*: none
headphone_detection: "Duration to Rewind"
*: ""
</source>
<dest>
*: none
headphone_detection: "Czas do cofnięcia"
*: ""
</dest>
<voice>
*: none
headphone_detection: "Czas do cofnięcia"
*: ""
</voice>
</phrase>
<phrase>
@ -2245,17 +2242,19 @@
iaudiox5,iaudiom5,gigabeat*,mrobe100: "Building database... %d found (LEFT to return)"
iriverh10,iriverh10_5gb,sansae200*,sansac200*,sansafuze*,vibe500: "Building database... %d found (PREV to return)"
gogearsa9200: "Building database... %d found (REW to return)"
archosplayer: "Building DB %d found"
</source>
<dest>
*: "Budowanie biblioteki... %d znalezionych (OFF żeby wrócić)"
iriverh100,iriverh120,iriverh300: "Budowanie biblioteki... %d znalezionych (STOP żeby wrócić)"
ipod*: "Budowanie biblioteki... %d znalezionych (PREV żeby wrócić)"
iaudiox5,iaudiom5,gigabeat*,mrobe100: "Budowanie biblioteki... %d znalezionych (LEFT żeby wrócić)"
iriverh10,iriverh10_5gb,sansae200*,sansac200*,sansafuze*,vibe500: "Budowanie biblioteki... %d znalezionych (PREV żeby wrócić)"
gogearsa9200: "Budowanie biblioteki... %d znalezionych (REW żeby wrócić)"
*: "Budowanie biblioteki... %d znalezionych (OFF by wrócić)"
iriverh100,iriverh120,iriverh300: "Budowanie biblioteki... %d znalezionych (STOP by wrócić)"
ipod*: "Budowanie biblioteki... %d znalezionych (PREV by wrócić)"
iaudiox5,iaudiom5,gigabeat*,mrobe100: "Budowanie biblioteki... %d znalezionych (LEFT by wrócić)"
iriverh10,iriverh10_5gb,sansae200*,sansac200*,sansafuze*,vibe500: "Budowanie biblioteki... %d znalezionych (PREV by wrócić)"
gogearsa9200: "Budowanie biblioteki... %d znalezionych (REW by wrócić)"
archosplayer: "Budowanie biblioteki %d znalezionych"
</dest>
<voice>
*: "Znaleziono wpisy do biblioteki"
*: "znaleziono wpisy do biblioteki"
</voice>
</phrase>
<phrase>
@ -12668,3 +12667,17 @@
*: "Tylko w wybranych katalogach"
</voice>
</phrase>
<phrase>
id: LANG_PAUSE_REWIND
desc: Seconds to rewind when rewind on pause is enabled.
user: core
<source>
*: "Rewind on Pause"
</source>
<dest>
*: "Cofaj po Wstrzymaniu"
</dest>
<voice>
*: "Cofaj po Wstrzymaniu"
</voice>
</phrase>

View file

@ -2812,6 +2812,7 @@
iaudiox5,iaudiom5,gigabeat*,mrobe100: "Building database... %d found (LEFT to return)"
iriverh10,iriverh10_5gb,sansae200*,sansac200*,sansafuze*,vibe500: "Building database... %d found (PREV to return)"
gogearsa9200: "Building database... %d found (REW to return)"
archosplayer: "Building DB %d found"
</source>
<dest>
*: "Creare bază de date... %d găsite (STINGERE pentru revenire)"
@ -2820,6 +2821,7 @@
iaudiox5,iaudiom5,gigabeat*,mrobe100: "Creare bază de date... %d găsite (LEFT pentru revenire)"
iriverh10,iriverh10_5gb,sansae200*,sansac200*,sansafuze*,vibe500: "Creare bază de date... %d găsite (PREV pentru revenire)"
gogearsa9200: "Creare bază de date... %d găsite (REW pentru revenire)"
archosplayer: "Creare bază de date... %d găsite"
</dest>
<voice>
*: "intrări găsite pentru baza de date"
@ -12721,25 +12723,6 @@
*: "Pornire explorator fișiere aici"
</voice>
</phrase>
<phrase>
id: LANG_RECORDING_HISTOGRAM_INTERVAL
desc: in record settings menu
user: core
<source>
*: none
recording_histogram: "Histogram interval"
</source>
<dest>
*: none
recording_histogram: "Intervalul histogramei"
</dest>
<voice>
*: none
recording_histogram: "Intervalul histogramei"
</voice>
</phrase>
<phrase>
id: LANG_PAUSE_REWIND
desc: Seconds to rewind when rewind on pause is enabled.
@ -12754,3 +12737,20 @@
*: "Rebobinare la pauză"
</voice>
</phrase>
<phrase>
id: LANG_HISTOGRAM_INTERVAL
desc: in record settings menu
user: core
<source>
*: none
histogram: "Histogram interval"
</source>
<dest>
*: none
histogram: "Histogram interval"
</dest>
<voice>
*: none
histogram: "Interval histogramă "
</voice>
</phrase>

View file

@ -1967,19 +1967,16 @@
</phrase>
<phrase>
id: LANG_HEADPHONE_UNPLUG_RW
desc: in pause_phones_menu.
desc: deprecated
user: core
<source>
*: none
headphone_detection: "Duration to Rewind"
*: ""
</source>
<dest>
*: none
headphone_detection: "За колико да се врати"
*: ""
</dest>
<voice>
*: none
headphone_detection: "За колико да се врати"
*: ""
</voice>
</phrase>
<phrase>
@ -2220,6 +2217,7 @@
iaudiox5,iaudiom5,gigabeat*,mrobe100: "Building database... %d found (LEFT to return)"
iriverh10,iriverh10_5gb,sansae200*,sansac200*,sansafuze*,vibe500: "Building database... %d found (PREV to return)"
gogearsa9200: "Building database... %d found (REW to return)"
archosplayer: "Building DB %d found"
</source>
<dest>
*: "Креирам базу података... %d пронађено (OFF за повратак)"
@ -2228,6 +2226,7 @@
iaudiox5,iaudiom5,gigabeat*,mrobe100: "Креирам базу података... %d пронађено (LEFT за повратак)"
iriverh10,iriverh10_5gb,sansae200*,sansac200*,sansafuze*,vibe500: "Креирам базу података... %d пронађено (PREV за повратак)"
gogearsa9200: "Креирам базу података... %d пронађено (REW за повратак)"
archosplayer: "Креирам БП %d пронађено"
</dest>
<voice>
*: ""
@ -12658,3 +12657,17 @@
*: ""
</voice>
</phrase>
<phrase>
id: LANG_PAUSE_REWIND
desc: Seconds to rewind when rewind on pause is enabled.
user: core
<source>
*: "Rewind on Pause"
</source>
<dest>
*: "Премотај код паузирања"
</dest>
<voice>
*: "Премотај код паузирања"
</voice>
</phrase>

View file

@ -456,8 +456,9 @@ static int asf_parse_header(int fd, struct mp3entry* id3,
lseek(fd, length, SEEK_CUR);
}
} else if (!strncmp("replaygain_", utf8buf, 11)) {
char *value = id3buf;
asf_utf16LEdecode(fd, length, &id3buf, &id3buf_remaining);
parse_replaygain(utf8buf, id3buf, id3);
parse_replaygain(utf8buf, value, id3);
} else if (!strcmp("MusicBrainz/Track Id", utf8buf)) {
id3->mb_track_id = id3buf;
asf_utf16LEdecode(fd, length, &id3buf, &id3buf_remaining);

View file

@ -170,7 +170,7 @@ bool warn_on_pl_erase(void)
/* Performance optimized version of the read_line() (see below) function. */
int fast_readline(int fd, char *buf, int buf_size, void *parameters,
int (*callback)(int n, const char *buf, void *parameters))
int (*callback)(int n, char *buf, void *parameters))
{
char *p, *next;
int rc, pos = 0;

View file

@ -57,7 +57,7 @@ bool warn_on_pl_erase(void);
*/
int read_line(int fd, char* buffer, int buffer_size);
int fast_readline(int fd, char *buf, int buf_size, void *parameters,
int (*callback)(int n, const char *buf, void *parameters));
int (*callback)(int n, char *buf, void *parameters));
bool settings_parseline(char* line, char** name, char** value);
long default_event_handler_ex(long event, void (*callback)(void *), void *parameter);

View file

@ -174,6 +174,12 @@ void radioart_init(bool entering_screen)
radioart[i].name[0] = '\0';
}
add_event(PLAYBACK_EVENT_START_PLAYBACK, true, playback_restarting_handler);
/* grab control over buffering */
char* buf;
size_t bufsize;
buf = audio_get_buffer(false, &bufsize);
buffering_reset(buf, bufsize);
}
else
{

View file

@ -390,7 +390,7 @@ static long find_entry_ram(const char *filename,
int i;
/* Check if tagcache is loaded into ram. */
if (!tc_stat.ramcache)
if (!tc_stat.ramcache || !is_dircache_intact())
return -1;
if (dc == NULL)
@ -538,8 +538,7 @@ static int find_index(const char *filename)
long idx_id = -1;
#if defined(HAVE_TC_RAMCACHE) && defined(HAVE_DIRCACHE)
if (tc_stat.ramcache && is_dircache_intact())
idx_id = find_entry_ram(filename, NULL);
idx_id = find_entry_ram(filename, NULL);
#endif
if (idx_id < 0)
@ -720,12 +719,25 @@ static bool retrieve(struct tagcache_search *tcs, struct index_entry *idx,
struct tagfile_entry *ep;
# ifdef HAVE_DIRCACHE
if (tag == tag_filename && (idx->flag & FLAG_DIRCACHE)
&& is_dircache_intact())
if (tag == tag_filename && (idx->flag & FLAG_DIRCACHE))
{
dircache_copy_path((struct dircache_entry *)seek,
buf, size);
return true;
/* for tag_filename, seek is a dircache index */
if (is_dircache_intact())
{
dircache_copy_path((struct dircache_entry *)seek,
buf, size);
return true;
}
else
{
/* The seek is useless now, there's nothing we can return. */
logf("retrieve: dircache gone, cannot read file name");
tagcache_unload_ramcache();
// XXX do this when there's a way to not trigger an
// update before reloading:
// tagcache_start_scan();
return false;
}
}
else
# endif
@ -1478,16 +1490,29 @@ static bool get_next(struct tagcache_search *tcs)
{
#if defined(HAVE_TC_RAMCACHE) && defined(HAVE_DIRCACHE)
if (tcs->type == tag_filename && (flag & FLAG_DIRCACHE)
&& is_dircache_intact())
if (tcs->type == tag_filename && (flag & FLAG_DIRCACHE))
{
dircache_copy_path((struct dircache_entry *)tcs->position,
buf, sizeof buf);
tcs->result = buf;
tcs->result_len = strlen(buf) + 1;
tcs->ramresult = false;
if (is_dircache_intact())
{
dircache_copy_path((struct dircache_entry *)tcs->position,
buf, sizeof buf);
tcs->result = buf;
tcs->result_len = strlen(buf) + 1;
tcs->ramresult = false;
return true;
return true;
}
else
{
/* The seek is useless now, there's nothing we can return. */
logf("get_next: dircache gone, cannot read file name");
tagcache_unload_ramcache();
// XXX do this when there's a way to not trigger an
// update before reloading:
// tagcache_start_scan();
tcs->valid = false;
return false;
}
}
else
#endif
@ -1804,10 +1829,7 @@ static void __attribute__ ((noinline)) add_tagcache(char *path,
/* Check if the file is already cached. */
#if defined(HAVE_TC_RAMCACHE) && defined(HAVE_DIRCACHE)
if (tc_stat.ramcache && is_dircache_intact())
{
idx_id = find_entry_ram(path, dc);
}
idx_id = find_entry_ram(path, dc);
#endif
/* Be sure the entry doesn't exist. */
@ -3373,7 +3395,7 @@ static bool read_tag(char *dest, long size,
return false;
}
static int parse_changelog_line(int line_n, const char *buf, void *parameters)
static int parse_changelog_line(int line_n, char *buf, void *parameters)
{
struct index_entry idx;
char tag_data[TAG_MAXLEN+32];
@ -3909,7 +3931,7 @@ static bool load_tagcache(void)
{
struct tagcache_header *tch;
struct master_header tcmh;
long bytesleft = tc_stat.ramcache_allocated;
long bytesleft = tc_stat.ramcache_allocated - sizeof(struct ramcache_header);
struct index_entry *idx;
int rc, fd;
char *p;
@ -3947,6 +3969,14 @@ static bool load_tagcache(void)
/* Load the master index table. */
for (i = 0; i < tcmh.tch.entry_count; i++)
{
bytesleft -= sizeof(struct index_entry);
if (bytesleft < 0)
{
logf("too big tagcache.");
close(fd);
return false;
}
rc = ecread_index_entry(fd, idx);
if (rc != sizeof(struct index_entry))
{
@ -3954,14 +3984,6 @@ static bool load_tagcache(void)
close(fd);
return false;
}
bytesleft -= sizeof(struct index_entry);
if (bytesleft < 0 || ((long)idx - (long)hdr->indices) >= tc_stat.ramcache_allocated)
{
logf("too big tagcache.");
close(fd);
return false;
}
idx++;
}

View file

@ -836,15 +836,21 @@ bool tagtree_import(void)
static bool parse_menu(const char *filename);
static int parse_line(int n, const char *buf, void *parameters)
static int parse_line(int n, char *buf, void *parameters)
{
char data[256];
int variable;
static bool read_menu;
int i;
char *p;
(void)parameters;
/* Strip possible <CR> at end of line. */
p = strchr(buf, '\r');
if (p != NULL)
*p = '\0';
logf("parse:%d/%s", n, buf);
/* First line, do initialisation. */
@ -1123,7 +1129,7 @@ static int format_str(struct tagcache_search *tcs, struct display_format *fmt,
buf[buf_pos++] = fmt->formatstr[i];
if (buf_pos - 1 >= buf_size)
if (buf_pos >= buf_size - 1) /* need at least one more byte for \0 */
{
logf("buffer overflow");
return -4;
@ -1238,6 +1244,7 @@ static int retrieve_entries(struct tree_context *c, int offset, bool init)
dptr->name = str(LANG_TAGNAVI_ALL_TRACKS);
dptr++;
current_entry_count++;
special_entry_count++;
}
if (offset <= 1)
{
@ -1246,12 +1253,12 @@ static int retrieve_entries(struct tree_context *c, int offset, bool init)
dptr->extraseek = -1;
dptr++;
current_entry_count++;
special_entry_count++;
}
special_entry_count+=2;
total_count += 2;
}
total_count += special_entry_count;
while (tagcache_get_next(&tcs))
{
if (total_count++ < offset)
@ -1380,7 +1387,7 @@ static int retrieve_entries(struct tree_context *c, int offset, bool init)
if (strip)
{
dptr = c->dircache;
for (i = 0; i < total_count; i++, dptr++)
for (i = special_entry_count; i < current_entry_count; i++, dptr++)
{
int len = strlen(dptr->name);

View file

@ -130,7 +130,7 @@
/* Main LCD backlight brightness range and defaults */
#define MIN_BRIGHTNESS_SETTING 1
#define MAX_BRIGHTNESS_SETTING 20
#define MAX_BRIGHTNESS_SETTING 12
#define DEFAULT_BRIGHTNESS_SETTING 6
/* define this if you have a light associated with the buttons */

View file

@ -331,6 +331,7 @@ static inline void usb_slave_mode(bool on)
if(rc)
panicf("storage: %d",rc);
sleep(HZ/10);
rc = disk_mount_all();
if(rc <= 0) /* no partition */
panicf("mount: %d",rc);

View file

@ -1,8 +1,8 @@
$publicrelease="3.8.1";
$manualrelease="3.8.1";
$voicerelease="3.8.1";
$releasedate="April 06, 2011";
$releasenotes="/wiki/ReleaseNotes381";
$publicrelease="3.9.1";
$manualrelease="3.9.1";
$voicerelease="3.9.1";
$releasedate="01 September 2011";
$releasenotes="/wiki/ReleaseNotes391";
%builds = (
'archosav300' => {

2
tools/configure vendored
View file

@ -232,6 +232,7 @@ simcc () {
LDOPTS="$LDOPTS -mconsole"
output="$output.exe"
winbuild="yes"
SHARED_CFLAGS=''
else
case $uname in
CYGWIN*)
@ -241,6 +242,7 @@ simcc () {
LDOPTS="$LDOPTS -mconsole"
output="$output.exe"
winbuild="yes"
SHARED_CFLAGS=''
;;
MINGW*)

30
tools/multigcc.pl Executable file → Normal file
View file

@ -1,5 +1,4 @@
#!/usr/bin/perl
use Switch;
use List::Util 'shuffle'; # standard from Perl 5.8 and later
my $tempfile = "multigcc.out";
@ -26,23 +25,22 @@ my $command = join " ", @params;
# count number of cores
my $cores;
switch($^O) {
case "darwin" {
chomp($cores = `sysctl -n hw.ncpu`);
$cores = 1 if ($?);
}
case "solaris" {
$cores = scalar grep /on-line/i, `psrinfo`;
$cores = 1 if ($?);
# Don't use given/when here - it's not compatible with old perl versions
if ($^O eq 'darwin') {
chomp($cores = `sysctl -n hw.ncpu`);
$cores = 1 if ($?);
}
elsif ($^O eq 'solaris') {
$cores = scalar grep /on-line/i, `psrinfo`;
$cores = 1 if ($?);
}
else {
if (open CPUINFO, "</proc/cpuinfo") {
$cores = scalar grep /^processor/i, <CPUINFO>;
close CPUINFO;
}
else {
if (open CPUINFO, "</proc/cpuinfo") {
$cores = scalar grep /^processor/i, <CPUINFO>;
close CPUINFO;
}
else {
$cores = 1;
}
$cores = 1;
}
}

View file

@ -1,5 +1,5 @@
#!/usr/bin/perl
$version="3.5RC";
$version="3.9.1";
require "tools/builds.pm";

View file

@ -1,6 +1,6 @@
#!/usr/bin/perl
$version="3.0";
$version="3.9.1";
require "tools/builds.pm";

View file

@ -1,6 +1,6 @@
#!/bin/sh
version="3.0"
version="3.9.1"
srcdir=.
tempdir=rockbox-temp

View file

@ -1,6 +1,6 @@
#!/usr/bin/perl
$version="3.0";
$version="3.9.1";
require "tools/builds.pm";

155
tools/voice.pl Executable file → Normal file
View file

@ -19,7 +19,6 @@ use strict;
use warnings;
use File::Basename;
use File::Copy;
use Switch;
use vars qw($V $C $t $l $e $E $s $S $i $v);
use IPC::Open2;
use IPC::Open3;
@ -74,36 +73,35 @@ sub init_tts {
our $verbose;
my ($tts_engine, $tts_engine_opts, $language) = @_;
my %ret = ("name" => $tts_engine);
switch($tts_engine) {
case "festival" {
print("> festival $tts_engine_opts --server\n") if $verbose;
my $pid = open(FESTIVAL_SERVER, "| festival $tts_engine_opts --server > /dev/null 2>&1");
my $dummy = *FESTIVAL_SERVER; #suppress warning
$SIG{INT} = sub { kill TERM => $pid; print("foo"); panic_cleanup(); };
$SIG{KILL} = sub { kill TERM => $pid; print("boo"); panic_cleanup(); };
$ret{"pid"} = $pid;
}
case "sapi" {
my $toolsdir = dirname($0);
my $path = `cygpath $toolsdir -a -w`;
chomp($path);
$path = $path . '\\';
my $cmd = $path . "sapi_voice.vbs /language:$language $tts_engine_opts";
$cmd =~ s/\\/\\\\/g;
print("> cscript //nologo $cmd\n") if $verbose;
my $pid = open2(*CMD_OUT, *CMD_IN, "cscript //nologo $cmd");
binmode(*CMD_IN, ':encoding(utf16le)');
binmode(*CMD_OUT, ':encoding(utf16le)');
$SIG{INT} = sub { print(CMD_IN "QUIT\r\n"); panic_cleanup(); };
$SIG{KILL} = sub { print(CMD_IN "QUIT\r\n"); panic_cleanup(); };
print(CMD_IN "QUERY\tVENDOR\r\n");
my $vendor = readline(*CMD_OUT);
$vendor =~ s/\r\n//;
%ret = (%ret,
"stdin" => *CMD_IN,
"stdout" => *CMD_OUT,
"vendor" => $vendor);
}
# Don't use given/when here - it's not compatible with old perl versions
if ($tts_engine eq 'festival') {
print("> festival $tts_engine_opts --server\n") if $verbose;
my $pid = open(FESTIVAL_SERVER, "| festival $tts_engine_opts --server > /dev/null 2>&1");
my $dummy = *FESTIVAL_SERVER; #suppress warning
$SIG{INT} = sub { kill TERM => $pid; print("foo"); panic_cleanup(); };
$SIG{KILL} = sub { kill TERM => $pid; print("boo"); panic_cleanup(); };
$ret{"pid"} = $pid;
}
elsif ($tts_engine eq 'sapi') {
my $toolsdir = dirname($0);
my $path = `cygpath $toolsdir -a -w`;
chomp($path);
$path = $path . '\\';
my $cmd = $path . "sapi_voice.vbs /language:$language $tts_engine_opts";
$cmd =~ s/\\/\\\\/g;
print("> cscript //nologo $cmd\n") if $verbose;
my $pid = open2(*CMD_OUT, *CMD_IN, "cscript //nologo $cmd");
binmode(*CMD_IN, ':encoding(utf16le)');
binmode(*CMD_OUT, ':encoding(utf16le)');
$SIG{INT} = sub { print(CMD_IN "QUIT\r\n"); panic_cleanup(); };
$SIG{KILL} = sub { print(CMD_IN "QUIT\r\n"); panic_cleanup(); };
print(CMD_IN "QUERY\tVENDOR\r\n");
my $vendor = readline(*CMD_OUT);
$vendor =~ s/\r\n//;
%ret = (%ret,
"stdin" => *CMD_IN,
"stdout" => *CMD_OUT,
"vendor" => $vendor);
}
return \%ret;
}
@ -111,15 +109,13 @@ sub init_tts {
# Shutdown TTS engine if necessary.
sub shutdown_tts {
my ($tts_object) = @_;
switch($$tts_object{"name"}) {
case "festival" {
# Send SIGTERM to festival server
kill TERM => $$tts_object{"pid"};
}
case "sapi" {
print({$$tts_object{"stdin"}} "QUIT\r\n");
close($$tts_object{"stdin"});
}
if ($$tts_object{'name'} eq 'festival') {
# Send SIGTERM to festival server
kill TERM => $$tts_object{"pid"};
}
elsif ($$tts_object{'name'} eq 'sapi') {
print({$$tts_object{"stdin"}} "QUIT\r\n");
close($$tts_object{"stdin"});
}
}
@ -146,48 +142,47 @@ sub voicestring {
our $verbose;
my ($string, $output, $tts_engine_opts, $tts_object) = @_;
my $cmd;
printf("Generate \"%s\" with %s in file %s\n", $string, $$tts_object{"name"}, $output) if $verbose;
switch($$tts_object{"name"}) {
case "festival" {
# festival_client lies to us, so we have to do awful soul-eating
# work with IPC::open3()
$cmd = "festival_client --server localhost --otype riff --ttw --output \"$output\"";
# Use festival-prolog.scm if it's there (created by user of tools/configure)
if (-f "festival-prolog.scm") {
$cmd .= " --prolog festival-prolog.scm";
}
print("> $cmd\n") if $verbose;
# Open command, and filehandles for STDIN, STDOUT, STDERR
my $pid = open3(*CMD_IN, *CMD_OUT, *CMD_ERR, $cmd);
# Put the string to speak into STDIN and close it
print(CMD_IN $string);
close(CMD_IN);
# Read all output from festival_client (because it LIES TO US)
while (<CMD_ERR>) {
}
close(CMD_OUT);
close(CMD_ERR);
my $name = $$tts_object{'name'};
printf("Generate \"%s\" with %s in file %s\n", $string, $name, $output) if $verbose;
if ($name eq 'festival') {
# festival_client lies to us, so we have to do awful soul-eating
# work with IPC::open3()
$cmd = "festival_client --server localhost --otype riff --ttw --output \"$output\"";
# Use festival-prolog.scm if it's there (created by user of tools/configure)
if (-f "festival-prolog.scm") {
$cmd .= " --prolog festival-prolog.scm";
}
case "flite" {
$cmd = "flite $tts_engine_opts -t \"$string\" \"$output\"";
print("> $cmd\n") if $verbose;
`$cmd`;
}
case "espeak" {
$cmd = "espeak $tts_engine_opts -w \"$output\"";
print("> $cmd\n") if $verbose;
open(ESPEAK, "| $cmd");
print ESPEAK $string . "\n";
close(ESPEAK);
}
case "sapi" {
print({$$tts_object{"stdin"}} "SPEAK\t$output\t$string\r\n");
}
case "swift" {
$cmd = "swift $tts_engine_opts -o \"$output\" \"$string\"";
print("> $cmd\n") if $verbose;
system($cmd);
print("> $cmd\n") if $verbose;
# Open command, and filehandles for STDIN, STDOUT, STDERR
my $pid = open3(*CMD_IN, *CMD_OUT, *CMD_ERR, $cmd);
# Put the string to speak into STDIN and close it
print(CMD_IN $string);
close(CMD_IN);
# Read all output from festival_client (because it LIES TO US)
while (<CMD_ERR>) {
}
close(CMD_OUT);
close(CMD_ERR);
}
elsif ($name eq 'flite') {
$cmd = "flite $tts_engine_opts -t \"$string\" \"$output\"";
print("> $cmd\n") if $verbose;
`$cmd`;
}
elsif ($name eq 'espeak') {
$cmd = "espeak $tts_engine_opts -w \"$output\"";
print("> $cmd\n") if $verbose;
open(ESPEAK, "| $cmd");
print ESPEAK $string . "\n";
close(ESPEAK);
}
elsif ($name eq 'sapi') {
print({$$tts_object{"stdin"}} "SPEAK\t$output\t$string\r\n");
}
elsif ($name eq 'swift') {
$cmd = "swift $tts_engine_opts -o \"$output\" \"$string\"";
print("> $cmd\n") if $verbose;
system($cmd);
}
}