Skip to content

Commit

Permalink
Merge pull request #66 from shiguredo/feature/fix-audio-sink-read2
Browse files Browse the repository at this point in the history
#64 の修正後、  SoraAudioSink.read() の実行タイミングによってはクラッシュが発生するようになった問題の対応
  • Loading branch information
enm10k authored May 28, 2024
2 parents a717971 + 80387f9 commit db50b72
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 2 deletions.
2 changes: 2 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
- @voluntas
- [FIX] SoraAudioSink.read が timeout を無視して失敗を返すケースがあったので修正する
- @enm10k
- [FIX] SoraAudioSink.read が timeout を無視するケースがある問題を修正した結果、 read の実行タイミングによってはクラッシュするようになったので修正する
- @enm10k

## 2024.2.0

Expand Down
7 changes: 5 additions & 2 deletions src/sora_audio_sink.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -137,14 +137,14 @@ nb::tuple SoraAudioSinkImpl::Read(size_t frames, float timeout) {
size_t num_of_samples;
if (frames > 0) {
// フレーム数のリクエストがある場合はリクエスト分が貯まるまで待つ
num_of_samples = frames * number_of_channels_;
if (!buffer_cond_.wait_for(
lock,
std::chrono::nanoseconds(
// Python の流儀に合わせて秒を float で受け取っているので換算
(int64_t)((double)timeout * 1000. * 1000. * 1000.)),
[&] {
return buffer_.size() >= num_of_samples ||
return (number_of_channels_ > 0 &&
buffer_.size() >= frames * number_of_channels_) ||
PyErr_CheckSignals() != 0;
})) {
// タイムアウトで返す
Expand All @@ -154,6 +154,9 @@ nb::tuple SoraAudioSinkImpl::Read(size_t frames, float timeout) {
// Signals で wait を抜けた時は返す
return nb::make_tuple(false, nb::none());
}
// std::condition_variable::wait_for の待機中に number_of_channels_ が更新される可能性があるため、
// 起床後に num_of_samples を計算する必要がある
num_of_samples = frames * number_of_channels_;
} else {
// フレーム数のリクエストがない場合はあるだけ全部出す
if (buffer_.empty()) {
Expand Down

0 comments on commit db50b72

Please # to comment.