Compare commits

..

2 Commits

Author SHA1 Message Date
Dave Horton 83a2d1d730 modify cache folder name and various fixes from testing tts streaming (#50) 2024-04-18 11:28:17 -04:00
Hoan Luu Huu 3f642467eb add properties to tts span for mod_*_tts (#45)
* add properties to tts span for mod_*_tts

Signed-off-by: Hoan HL <quan.luuhoang8@gmail.com>

* support deepgram tts span

Signed-off-by: Hoan HL <quan.luuhoang8@gmail.com>

* support tts span for playht

Signed-off-by: Hoan HL <quan.luuhoang8@gmail.com>

* support rimelabs tts span

Signed-off-by: Hoan HL <quan.luuhoang8@gmail.com>

---------

Signed-off-by: Hoan HL <quan.luuhoang8@gmail.com>
2024-04-14 09:13:54 -04:00
14 changed files with 131 additions and 91 deletions
+60 -55
View File
@@ -59,7 +59,7 @@ extern "C" {
return SWITCH_STATUS_FALSE;
}
fullDirPath = std::string(baseDir) + "jambonz-tts-cache-files";
fullDirPath = std::string(baseDir) + "tts-cache-files";
// Create the directory with read, write, and execute permissions for everyone
mode_t oldMask = umask(0);
@@ -179,72 +179,77 @@ extern "C" {
speechConfig->SetEndpointId(a->endpointId);
}
auto speechSynthesizer = SpeechSynthesizer::FromConfig(speechConfig);
try {
auto speechSynthesizer = SpeechSynthesizer::FromConfig(speechConfig);
speechSynthesizer->SynthesisStarted += [a](const SpeechSynthesisEventArgs& e) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "azure_speech_feed_tts SynthesisStarted\n");
};
speechSynthesizer->SynthesisStarted += [a](const SpeechSynthesisEventArgs& e) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "azure_speech_feed_tts SynthesisStarted\n");
};
speechSynthesizer->Synthesizing += [a](const SpeechSynthesisEventArgs& e) {
if (a->flushed) return;
bool fireEvent = false;
CircularBuffer_t *cBuffer = (CircularBuffer_t *) a->circularBuffer;
speechSynthesizer->Synthesizing += [a](const SpeechSynthesisEventArgs& e) {
if (a->flushed) return;
bool fireEvent = false;
CircularBuffer_t *cBuffer = (CircularBuffer_t *) a->circularBuffer;
auto audioData = e.Result->GetAudioData();
if (a->file) {
fwrite(audioData->data(), 1, audioData->size(), a->file);
}
auto audioData = e.Result->GetAudioData();
if (a->file) {
fwrite(audioData->data(), 1, audioData->size(), a->file);
}
/**
* this sort of reinterpretation can be dangerous as a general rule, but in this case we know that the data
* is 16-bit PCM, so it's safe to do this and its much faster than copying the data byte by byte
*/
const uint16_t* begin = reinterpret_cast<const uint16_t*>(audioData->data());
const uint16_t* end = reinterpret_cast<const uint16_t*>(audioData->data() + audioData->size());
/**
* this sort of reinterpretation can be dangerous as a general rule, but in this case we know that the data
* is 16-bit PCM, so it's safe to do this and its much faster than copying the data byte by byte
*/
const uint16_t* begin = reinterpret_cast<const uint16_t*>(audioData->data());
const uint16_t* end = reinterpret_cast<const uint16_t*>(audioData->data() + audioData->size());
/* lock as briefly as possible */
switch_mutex_lock(a->mutex);
if (cBuffer->capacity() - cBuffer->size() < audioData->size()) {
cBuffer->set_capacity(cBuffer->size() + std::max( audioData->size(), (size_t)BUFFER_SIZE));
}
cBuffer->insert(cBuffer->end(), begin, end);
switch_mutex_unlock(a->mutex);
/* lock as briefly as possible */
switch_mutex_lock(a->mutex);
if (cBuffer->capacity() - cBuffer->size() < audioData->size()) {
cBuffer->set_capacity(cBuffer->size() + std::max( audioData->size(), (size_t)BUFFER_SIZE));
}
cBuffer->insert(cBuffer->end(), begin, end);
switch_mutex_unlock(a->mutex);
if (0 == a->reads++) {
fireEvent = true;
}
if (0 == a->reads++) {
fireEvent = true;
}
if (fireEvent && a->session_id) {
auto endTime = std::chrono::high_resolution_clock::now();
auto startTime = *static_cast<std::chrono::time_point<std::chrono::high_resolution_clock>*>(a->startTime);
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime);
auto time_to_first_byte_ms = std::to_string(duration.count());
switch_core_session_t* session = switch_core_session_locate(a->session_id);
if (session) {
switch_channel_t *channel = switch_core_session_get_channel(session);
switch_core_session_rwunlock(session);
if (channel) {
switch_event_t *event;
if (switch_event_create(&event, SWITCH_EVENT_PLAYBACK_START) == SWITCH_STATUS_SUCCESS) {
switch_channel_event_set_data(channel, event);
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Playback-File-Type", "tts_stream");
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variable_tts_time_to_first_byte_ms", time_to_first_byte_ms.c_str());
if (a->cache_filename) {
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variable_tts_cache_filename", a->cache_filename);
if (fireEvent && a->session_id) {
auto endTime = std::chrono::high_resolution_clock::now();
auto startTime = *static_cast<std::chrono::time_point<std::chrono::high_resolution_clock>*>(a->startTime);
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime);
auto time_to_first_byte_ms = std::to_string(duration.count());
switch_core_session_t* session = switch_core_session_locate(a->session_id);
if (session) {
switch_channel_t *channel = switch_core_session_get_channel(session);
switch_core_session_rwunlock(session);
if (channel) {
switch_event_t *event;
if (switch_event_create(&event, SWITCH_EVENT_PLAYBACK_START) == SWITCH_STATUS_SUCCESS) {
switch_channel_event_set_data(channel, event);
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Playback-File-Type", "tts_stream");
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variable_tts_time_to_first_byte_ms", time_to_first_byte_ms.c_str());
if (a->cache_filename) {
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variable_tts_cache_filename", a->cache_filename);
}
switch_event_fire(&event);
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "speechSynthesizer->Synthesizing: failed to create event\n");
}
switch_event_fire(&event);
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "speechSynthesizer->Synthesizing: failed to create event\n");
}else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "speechSynthesizer->Synthesizing: channel not found\n");
}
}else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "speechSynthesizer->Synthesizing: channel not found\n");
}
}
}
};
};
std::thread(start_synthesis, speechSynthesizer, text, a).detach();
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "azure_speech_feed_tts sent synthesize request\n");
std::thread(start_synthesis, speechSynthesizer, text, a).detach();
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "azure_speech_feed_tts sent synthesize request\n");
} catch (const std::exception& e) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "mod_azure_tts: Exception: %s\n", e.what());
return SWITCH_STATUS_FALSE;
}
return SWITCH_STATUS_SUCCESS;
}
+13 -4
View File
@@ -385,7 +385,7 @@ static size_t write_cb(void *ptr, size_t size, size_t nmemb, ConnInfo_t *conn) {
auto d = conn->deepgram;
CircularBuffer_t *cBuffer = (CircularBuffer_t *) d->circularBuffer;
if (conn->flushed) {
if (conn->flushed || cBuffer == nullptr) {
/* this will abort the transfer */
return 0;
}
@@ -470,8 +470,14 @@ static size_t write_cb(void *ptr, size_t size, size_t nmemb, ConnInfo_t *conn) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "write_cb: firing playback-started\n");
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Playback-File-Type", "tts_stream");
if (d->reported_latency) {
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variable_tts_deepgram_reported_latency_ms", d->reported_latency);
if (d->reported_model_name) {
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variable_tts_deepgram_reported_model_name", d->reported_model_name);
}
if (d->reported_model_uuid) {
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variable_tts_deepgram_reported_model_uuid", d->reported_model_uuid);
}
if (d->reported_char_count) {
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variable_tts_deepgram_reported_char_count", d->reported_char_count);
}
if (d->request_id) {
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variable_tts_deepgram_request_id", d->request_id);
@@ -549,6 +555,9 @@ static size_t header_callback(char *buffer, size_t size, size_t nitems, ConnInfo
if (parseHeader(input, header, value)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "recv header: %s with value %s\n", header.c_str(), value.c_str());
if (0 == header.compare("dg-request-id")) d->request_id = strdup(value.c_str());
else if (0 == header.compare("dg-model-name")) d->reported_model_name = strdup(value.c_str());
else if (0 == header.compare("dg-model-uuid")) d->reported_model_uuid = strdup(value.c_str());
else if (0 == header.compare("dg-char-count")) d->reported_char_count = strdup(value.c_str());
}
else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "header_callback: %s\n", input.c_str());
@@ -632,7 +641,7 @@ extern "C" {
return SWITCH_STATUS_FALSE;
}
fullDirPath = std::string(baseDir) + "jambonz-tts-cache-files";
fullDirPath = std::string(baseDir) + "tts-cache-files";
// Create the directory with read, write, and execute permissions for everyone
mode_t oldMask = umask(0);
+6 -2
View File
@@ -10,7 +10,9 @@ static void cleardeepgram(deepgram_t* d, int freeAll) {
if (d->api_key) free(d->api_key);
if (d->request_id) free(d->request_id);
if (d->reported_latency) free(d->reported_latency);
if (d->reported_model_name) free(d->reported_model_name);
if (d->reported_model_uuid) free(d->reported_model_uuid);
if (d->reported_char_count) free(d->reported_char_count);
if (d->ct) free(d->ct);
if (d->err_msg) free(d->err_msg);
if (d->name_lookup_time_ms) free(d->name_lookup_time_ms);
@@ -22,7 +24,9 @@ static void cleardeepgram(deepgram_t* d, int freeAll) {
d->api_key = NULL;
d->request_id = NULL;
d->reported_latency = NULL;
d->reported_model_name = NULL;
d->reported_model_uuid = NULL;
d->reported_char_count = NULL;
d->ct = NULL;
d->err_msg = NULL;
d->name_lookup_time_ms = NULL;
+8 -1
View File
@@ -11,7 +11,14 @@ typedef struct deepgram_data {
/* result data */
long response_code;
char *ct;
char *reported_latency;
// Deepgram hedaers
//dg-model-name
char *reported_model_name;
//dg-model-uuid
char *reported_model_uuid;
//dg-char-count
char *reported_char_count;
//dg-request-id
char *request_id;
char *name_lookup_time_ms;
char *connect_time_ms;
+2 -2
View File
@@ -445,7 +445,7 @@ static size_t write_cb(void *ptr, size_t size, size_t nmemb, ConnInfo_t *conn) {
CircularBuffer_t *cBuffer = (CircularBuffer_t *) el->circularBuffer;
std::vector<uint16_t> pcm_data;
if (conn->flushed) {
if (conn->flushed || cBuffer == nullptr) {
/* this will abort the transfer */
return 0;
}
@@ -688,7 +688,7 @@ extern "C" {
return SWITCH_STATUS_FALSE;
}
fullDirPath = std::string(baseDir) + "jambonz-tts-cache-files";
fullDirPath = std::string(baseDir) + "tts-cache-files";
// Create the directory with read, write, and execute permissions for everyone
mode_t oldMask = umask(0);
-2
View File
@@ -21,7 +21,6 @@ static void clearPlayht(playht_t* p, int freeAll) {
if (p->request_id) free(p->request_id);
if (p->reported_latency) free(p->reported_latency);
if (p->ct) free(p->ct);
if (p->err_msg) free(p->err_msg);
if (p->name_lookup_time_ms) free(p->name_lookup_time_ms);
@@ -43,7 +42,6 @@ static void clearPlayht(playht_t* p, int freeAll) {
p->text_guidance = NULL;
p->request_id = NULL;
p->reported_latency = NULL;
p->ct = NULL;
p->err_msg = NULL;
p->name_lookup_time_ms = NULL;
-1
View File
@@ -19,7 +19,6 @@ typedef struct playht_data {
/* result data */
long response_code;
char *ct;
char *reported_latency;
char *request_id;
char *name_lookup_time_ms;
char *connect_time_ms;
+3 -7
View File
@@ -436,7 +436,7 @@ static size_t write_cb(void *ptr, size_t size, size_t nmemb, ConnInfo_t *conn) {
CircularBuffer_t *cBuffer = (CircularBuffer_t *) p->circularBuffer;
std::vector<uint16_t> pcm_data;
if (conn->flushed) {
if (conn->flushed || cBuffer == nullptr) {
/* this will abort the transfer */
return 0;
}
@@ -489,9 +489,6 @@ static size_t write_cb(void *ptr, size_t size, size_t nmemb, ConnInfo_t *conn) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "write_cb: firing playback-started\n");
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Playback-File-Type", "tts_stream");
if (p->reported_latency) {
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variable_tts_playht_reported_latency_ms", p->reported_latency);
}
if (p->request_id) {
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variable_tts_playht_request_id", p->request_id);
}
@@ -567,8 +564,7 @@ static size_t header_callback(char *buffer, size_t size, size_t nitems, ConnInfo
std::string input(buffer, bytes_received);
if (parseHeader(input, header, value)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "recv header: %s with value %s\n", header.c_str(), value.c_str());
if (0 == header.compare("openai-processing-ms")) p->reported_latency = strdup(value.c_str());
else if (0 == header.compare("x-request-id")) p->request_id = strdup(value.c_str());
if (0 == header.compare("x-job-ids")) p->request_id = strdup(value.c_str());
}
else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "header_callback: %s\n", input.c_str());
@@ -652,7 +648,7 @@ extern "C" {
return SWITCH_STATUS_FALSE;
}
fullDirPath = std::string(baseDir) + "jambonz-tts-cache-files";
fullDirPath = std::string(baseDir) + "tts-cache-files";
// Create the directory with read, write, and execute permissions for everyone
mode_t oldMask = umask(0);
-4
View File
@@ -12,8 +12,6 @@ static void clearrimelabs(rimelabs_t* d, int freeAll) {
if (d->speed_alpha) free(d->speed_alpha);
if (d->reduce_latency) free(d->reduce_latency);
if (d->request_id) free(d->request_id);
if (d->reported_latency) free(d->reported_latency);
if (d->ct) free(d->ct);
if (d->err_msg) free(d->err_msg);
if (d->name_lookup_time_ms) free(d->name_lookup_time_ms);
@@ -27,8 +25,6 @@ static void clearrimelabs(rimelabs_t* d, int freeAll) {
d->speed_alpha = NULL;
d->reduce_latency = NULL;
d->request_id = NULL;
d->reported_latency = NULL;
d->ct = NULL;
d->err_msg = NULL;
d->name_lookup_time_ms = NULL;
-2
View File
@@ -14,8 +14,6 @@ typedef struct rimelabs_data {
/* result data */
long response_code;
char *ct;
char *reported_latency;
char *request_id;
char *name_lookup_time_ms;
char *connect_time_ms;
char *final_response_time_ms;
+2 -9
View File
@@ -386,7 +386,7 @@ static size_t write_cb(void *ptr, size_t size, size_t nmemb, ConnInfo_t *conn) {
auto d = conn->rimelabs;
CircularBuffer_t *cBuffer = (CircularBuffer_t *) d->circularBuffer;
if (conn->flushed) {
if (conn->flushed || cBuffer == nullptr) {
/* this will abort the transfer */
return 0;
}
@@ -471,12 +471,6 @@ static size_t write_cb(void *ptr, size_t size, size_t nmemb, ConnInfo_t *conn) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "write_cb: firing playback-started\n");
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Playback-File-Type", "tts_stream");
if (d->reported_latency) {
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variable_tts_rimelabs_reported_latency_ms", d->reported_latency);
}
if (d->request_id) {
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variable_tts_rimelabs_request_id", d->request_id);
}
if (d->name_lookup_time_ms) {
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variable_tts_rimelabs_name_lookup_time_ms", d->name_lookup_time_ms);
}
@@ -549,7 +543,6 @@ static size_t header_callback(char *buffer, size_t size, size_t nitems, ConnInfo
std::string input(buffer, bytes_received);
if (parseHeader(input, header, value)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "recv header: %s with value %s\n", header.c_str(), value.c_str());
if (0 == header.compare("dg-request-id")) d->request_id = strdup(value.c_str());
}
else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "header_callback: %s\n", input.c_str());
@@ -633,7 +626,7 @@ extern "C" {
return SWITCH_STATUS_FALSE;
}
fullDirPath = std::string(baseDir) + "jambonz-tts-cache-files";
fullDirPath = std::string(baseDir) + "tts-cache-files";
// Create the directory with read, write, and execute permissions for everyone
mode_t oldMask = umask(0);
+8
View File
@@ -12,6 +12,10 @@ static void clearWhisper(whisper_t* w, int freeAll) {
if (w->speed) free(w->speed);
if (w->request_id) free(w->request_id);
if (w->reported_latency) free(w->reported_latency);
if (w->reported_organization) free(w->reported_organization);
if (w->reported_ratelimit_requests) free(w->reported_ratelimit_requests);
if (w->reported_ratelimit_remaining_requests) free(w->reported_ratelimit_remaining_requests);
if (w->reported_ratelimit_reset_requests) free(w->reported_ratelimit_reset_requests);
if (w->ct) free(w->ct);
if (w->err_msg) free(w->err_msg);
if (w->name_lookup_time_ms) free(w->name_lookup_time_ms);
@@ -25,6 +29,10 @@ static void clearWhisper(whisper_t* w, int freeAll) {
w->speed = NULL;
w->request_id = NULL;
w->reported_latency = NULL;
w->reported_organization = NULL;
w->reported_ratelimit_requests = NULL;
w->reported_ratelimit_remaining_requests = NULL;
w->reported_ratelimit_reset_requests = NULL;
w->ct = NULL;
w->err_msg = NULL;
w->name_lookup_time_ms = NULL;
+11
View File
@@ -11,7 +11,18 @@ typedef struct whisper_data {
/* result data */
long response_code;
char *ct;
//whisper headers
//openai-organization
char *reported_organization;
//openai-processing-ms
char *reported_latency;
//x-ratelimit-limit-requests
char *reported_ratelimit_requests;
//x-ratelimit-remaining-requests
char *reported_ratelimit_remaining_requests;
//x-ratelimit-reset-requests
char *reported_ratelimit_reset_requests;
//x-request-id
char *request_id;
char *name_lookup_time_ms;
char *connect_time_ms;
+18 -2
View File
@@ -436,7 +436,7 @@ static size_t write_cb(void *ptr, size_t size, size_t nmemb, ConnInfo_t *conn) {
CircularBuffer_t *cBuffer = (CircularBuffer_t *) w->circularBuffer;
std::vector<uint16_t> pcm_data;
if (conn->flushed) {
if (conn->flushed || cBuffer == nullptr) {
/* this will abort the transfer */
return 0;
}
@@ -495,6 +495,18 @@ static size_t write_cb(void *ptr, size_t size, size_t nmemb, ConnInfo_t *conn) {
if (w->request_id) {
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variable_tts_whisper_request_id", w->request_id);
}
if (w->reported_organization) {
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variable_tts_whisper_reported_organization", w->reported_latency);
}
if (w->reported_ratelimit_requests) {
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variable_tts_whisper_reported_ratelimit_requests", w->reported_ratelimit_requests);
}
if (w->reported_ratelimit_remaining_requests) {
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variable_tts_whisper_reported_ratelimit_remaining_requests", w->reported_ratelimit_remaining_requests);
}
if (w->reported_ratelimit_reset_requests) {
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variable_tts_whisper_reported_ratelimit_reset_requests", w->reported_ratelimit_reset_requests);
}
if (w->name_lookup_time_ms) {
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variable_tts_whisper_name_lookup_time_ms", w->name_lookup_time_ms);
}
@@ -572,6 +584,10 @@ static size_t header_callback(char *buffer, size_t size, size_t nitems, ConnInfo
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "recv header: %s with value %s\n", header.c_str(), value.c_str());
if (0 == header.compare("openai-processing-ms")) w->reported_latency = strdup(value.c_str());
else if (0 == header.compare("x-request-id")) w->request_id = strdup(value.c_str());
else if (0 == header.compare("openai-organization")) w->reported_organization = strdup(value.c_str());
else if (0 == header.compare("x-ratelimit-limit-requests")) w->reported_ratelimit_requests = strdup(value.c_str());
else if (0 == header.compare("x-ratelimit-remaining-requests")) w->reported_ratelimit_remaining_requests = strdup(value.c_str());
else if (0 == header.compare("x-ratelimit-reset-requests")) w->reported_ratelimit_reset_requests = strdup(value.c_str());
}
else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "header_callback: %s\n", input.c_str());
@@ -655,7 +671,7 @@ extern "C" {
return SWITCH_STATUS_FALSE;
}
fullDirPath = std::string(baseDir) + "jambonz-tts-cache-files";
fullDirPath = std::string(baseDir) + "tts-cache-files";
// Create the directory with read, write, and execute permissions for everyone
mode_t oldMask = umask(0);