1 /*---------------------------------------------------------------------------*
2 Project: Horizon
3 File: snd_Api.h
4
5 Copyright (C)2009 Nintendo Co., Ltd. All rights reserved.
6
7 These coded instructions, statements, and computer programs contain
8 proprietary information of Nintendo of America Inc. and/or Nintendo
9 Company Ltd., and are protected by Federal copyright law. They may
10 not be disclosed to third parties or copied or duplicated in any form,
11 in whole or in part, without the prior written consent of Nintendo.
12
13 $Rev: 33675 $
14 *---------------------------------------------------------------------------*/
15
16 #ifndef NN_SND_API_H_
17 #define NN_SND_API_H_
18
19 #include <nn/Result.h>
20 #include <nn/snd/CTR/Common/snd_Types.h>
21 #include <nn/snd/CTR/MPCore/snd_Voice.h>
22 #include <nn/snd/CTR/MPCore/snd_OutputCapture.h>
23 #include <nn/snd/CTR/MPCore/snd_FxDelay.h>
24 #include <nn/snd/CTR/MPCore/snd_FxReverb.h>
25
26 #ifdef __cplusplus
27
28 /*! @file
29 @brief サウンド(SND)に関する API の宣言
30 */
31
32 namespace nn { namespace snd { namespace CTR {
33
34 /*!
35 @brief 1 サウンドフレームあたりの DSP のサイクル数の最大値です。
36 */
37 static const s32 NN_SND_DSP_MAXIMUM_CYCLES = 622535;
38
39
40 /*!
41 @name Initialize/Finalize
42
43 @{
44 */
45 /*!
46 @brief サウンドライブラリの初期化処理を行います。
47
48 @ref nn::dsp::Initialize() によりDSP プロセスとのセッション確立後に使用できます。
49
50 @return 処理の結果が返ってきます。<BR>
51 LEVEL_SUCCESS:SUMMARY_SUCCESS:MODULE_COMMON:DESCRIPTION_SUCCESS・・・成功しました。
52 */
53 nn::Result Initialize();
54
55 /*!
56 @brief サウンドライブラリの終了処理を行います。
57
58 @return 処理の結果が返ってきます。<BR>
59 LEVEL_SUCCESS:SUMMARY_SUCCESS:MODULE_COMMON:DESCRIPTION_SUCCESS・・・成功しました。
60 */
61 nn::Result Finalize();
62
63 /*!
64 @brief バッファ情報構造体の初期化を行います。
65
66 @ref nn::snd::Voice::AppendWaveBuffer を呼び出す前に、本関数で構造体を初期化して下さい。
67
68 @param[in] pWaveBuffer バッファ情報構造体へのポインタ
69 @return なし。
70 */
71 void InitializeWaveBuffer(WaveBuffer * pWaveBuffer);
72
73 /*! :private
74 @brief サウンドスレッドを作成します。
75 */
76 nn::Result StartSoundThread(
77 void (*callback)(uptr),
78 uptr arg,
79 uptr stackBuffer,
80 size_t stackSize,
81 s32 prio,
82 s32 coreNo = NN_OS_CORE_NO_USE_PROCESS_VALUE
83 );
84
85 /*! :private
86 @brief ユーザーサウンドスレッドを作成します。
87 */
88 nn::Result StartUserSoundThread(uptr stackBuffer, size_t stackSize, s32 prio);
89
90 /*! :private
91 @brief サウンドスレッドを作成します。
92 */
93 nn::Result StartSoundThread(
94 const ThreadParameter* mainThreadParam,
95 void (*mainThreadCallback)(uptr),
96 uptr mainThreadArg,
97 const ThreadParameter* userThreadParam,
98 void (*userThreadCallback)(uptr),
99 uptr userThreadArg,
100 s32 coreNo
101 );
102
103 /*! :private
104 @brief StartSoundThread で作成したサウンドスレッドを終了します。
105 */
106 void FinalizeSoundThread();
107
108 /*! :private
109 @brief StartUserSoundThread で作成したユーザーサウンドスレッドを終了します。
110 */
FinalizeUserSoundThread()111 inline void FinalizeUserSoundThread() {}
112
113 /*! :private
114 @brief サウンドフレームの処理負荷を有効 / 無効にします。
115
116 デフォルトは無効です。
117
118 @param[in] enable true なら有効、false なら無効
119 */
120 void EnableSoundThreadTickCounter(bool enable);
121
122 /*! :private
123 @brief StartSoundThread で作成したサウンドスレッドの、1 サウンドフレームあたりの処理負荷を取得します。
124
125 コールバック内で呼び出した場合は、ひとつ前のサウンドフレームの処理負荷が得られます。
126 */
127 nn::os::Tick GetSoundThreadTick();
128
129 /*! :private
130 @brief StartSoundThread で作ったサウンドスレッドとの排他制御のためのロックを行います。
131 */
132 void LockSoundThread();
133
134 /*! :private
135 @brief StartSoundThread で作ったサウンドスレッドとの排他制御のためのロックを解除します。
136 */
137 void UnlockSoundThread();
138
139 /*! :private
140 @brief 自動 UpdateCommand の設定を行います。
141 @param[in] autoUpdateCommand true なら自動アップデート
142 */
143 void SetAutoUpdateCommand(bool autoUpdateCommand);
144
145 // TORIAEZU: CTR-SDK 0.14 を NintendoWare 1.1.1 と組み合わせて使用するための暫定措置
EnableAuxBusProcessingOnCore1(bool)146 inline void EnableAuxBusProcessingOnCore1(bool /*enable*/) {}
EnableSoundThreadCallbackOnCore1(bool)147 inline void EnableSoundThreadCallbackOnCore1(bool /*enable*/) {}
EnableVoiceDropCallbackOnCore1(bool)148 inline void EnableVoiceDropCallbackOnCore1(bool /*enable*/) {}
149
150 /*!
151 @}
152 */
153
154 /*!
155 @name キャッシュ操作
156
157 @{
158 */
159 /*!
160 @brief 指定された範囲のデータをキャッシュからメモリに書き戻し、キャッシュを無効にします。
161
162 動作は @ref nn::dsp::CTR::FlushDataCache と同じです。
163
164 @param[in] addr メモリアドレス
165 @param[in] size メモリサイズ
166 @return 処理の結果が返ります。<BR>
167 LEVEL_SUCCESS:SUMMARY_SUCCESS:MODULE_COMMON:DESCRIPTION_SUCCESS・・・成功しました。<BR>
168 LEVEL_STATUS:SUMMARY_INVALID_STATE:MODULE_NN_DSP:DESCRIPTION_NOT_INITIALIZED・・・DSP ライブラリが初期化されていません。<BR>
169 */
170 nn::Result FlushDataCache( uptr addr, size_t size );
171
172 /*! :private
173 @brief 指定された範囲のキャッシュを無効にします。
174
175 動作は @ref nn::dsp::CTR::InvalidateDataCache と同じです。
176
177 @param[in] addr メモリアドレス
178 @param[in] size メモリサイズ
179 @return 処理の結果が返ります。<BR>
180 LEVEL_SUCCESS:SUMMARY_SUCCESS:MODULE_COMMON:DESCRIPTION_SUCCESS・・・成功しました。<BR>
181 LEVEL_STATUS:SUMMARY_INVALID_STATE:MODULE_NN_DSP:DESCRIPTION_NOT_INITIALIZED・・・DSP ライブラリが初期化されていません。<BR>
182 */
183 nn::Result InvalidateDataCache( uptr addr, size_t size );
184
185 /*!
186 @}
187 */
188
189 /*!
190 @name 同期処理
191
192 @{
193 */
194
195 /*!
196 @brief DSP で処理を行った結果を受信します。
197
198 サウンドフレームイベントが発生するまで待機します。
199 シグナルが通知された後、DSP からのデータを受信します。
200
201 本関数は snd ライブラリが内部に持つ @ref nn::os::Event
202 オブジェクトによりイベント待機を行います。
203
204 @return なし。
205 */
206 void WaitForDspSync();
207
208 /*! :private
209 @brief DSP で処理を行った結果を受信し、受信に要した処理時間を取得します。
210
211 サウンドフレームイベントが発生するまで待機します。
212 シグナルが通知された後、DSP からのデータを受信します。
213
214 本関数は snd ライブラリが内部に持つ @ref nn::os::Event
215 オブジェクトによりイベント待機を行います。
216
217 @param[out] pTick 内部の Wait 以外の処理に要したサイクル数
218 @return なし。
219 */
220 void WaitForDspSync(nn::os::Tick* pTick);
221
222 /*!
223 @brief 設定されたパラメータをDSP に反映します。
224
225 @return なし。
226 */
227 void SendParameterToDsp();
228
229 /*! :private
230 @brief 必要であれば内部で UpdateCommand を実行し、設定されたパラメータを DSP に反映します。
231 @param[in] autoUpdateCommand true なら内部で UpdateCommand を実行します。
232 */
233 void SendParameterToDsp(bool autoUpdateCommand);
234
235 /*! :private
236 @brief 発行したコマンドを DSP へ送信します。
237 */
238 void UpdateCommand();
239
240 /*!
241 @}
242 */
243
244 /*!
245 @brief サンプルの長さを取得します。
246
247 @param[in] size サイズ(バイト単位)
248 @param[in] format 形式
249 @param[in] channelCount チャンネル数
250 @return サンプルの長さを返します。
251 */
252 s32 GetSampleLength( s32 size, SampleFormat format, s32 channelCount ) ;
253
254 /*!
255 @name マスター操作、Aux バス操作
256 @{
257 */
258 /*!
259 @brief マスターボリュームを設定します。
260
261 @param[in] volume マスターボリューム(1.0 が等倍)
262 @return なし。
263 */
264 void SetMasterVolume ( f32 volume );
265
266 /*!
267 @brief Aux バスボリュームを設定します。
268
269 等倍は 1.0 です。
270
271 デフォルト値は 1.0 です。
272
273 @param[in] busId バスの ID
274 @param[in] volume エフェクト 0 バスボリューム(1.0 が等倍)
275 @return なし。
276 */
277 void SetAuxReturnVolume ( AuxBusId busId, f32 volume );
278
279 /*!
280 @brief Aux バスボリュームを取得します。
281
282 等倍は 1.0 です。
283
284 デフォルト値は 1.0 です。
285
286 @param[in] busId バスの ID
287 @return バスボリューム。
288 */
289 f32 GetAuxReturnVolume ( AuxBusId busId ) ;
290
291 /*!
292 @brief Aux バスのコールバック関数を設定します。
293
294 @param[in] busId バスの ID
295 @param[in] callback コールバック関数
296 @param[in] userData ユーザ定義データ
297 @return なし。
298 */
299 void RegisterAuxCallback( AuxBusId busId, AuxCallback callback, uptr userData );
300
301 /*!
302 @brief Aux バスのコールバック関数を取得します。
303
304 @param[in] busId バスの ID
305 @param[out] pCallback コールバック関数の格納先
306 @param[out] pUserData ユーザ定義データの格納先
307 @return なし。
308 */
309 void GetAuxCallback( AuxBusId busId, AuxCallback* pCallback, uptr* pUserData );
310
311 /*!
312 @brief Aux バスのコールバック関数を解除します。
313
314 @param[in] busId バスの ID
315 @return なし。
316 */
317 void ClearAuxCallback( AuxBusId busId );
318
319 /*!
320 @brief Aux バスのフロントバイパスを設定します。
321 @param[in] busId バスの ID
322 @param[in] flag フロントバイパスの有効 / 無効フラグ
323 @return 設定に成功すれば true を、失敗すれば false を返します。
324 */
325 bool SetAuxFrontBypass(AuxBusId busId, bool flag);
326 /*!
327 @}
328 */
329
330 /*!
331 @name 3D サラウンド
332 @{
333 */
334 /*!
335 @brief サウンド出力モードを設定します。
336
337 @param[in] mode サウンド出力モード
338 @return 設定に成功すれば true を、失敗すれば false を返します。
339 */
340 bool SetSoundOutputMode(OutputMode mode);
341
342 /*!
343 @brief サウンド出力モードを取得します。
344
345 @return サウンド出力モード
346 */
347 OutputMode GetSoundOutputMode();
348
349 /*!
350 @brief クリッピングモードを設定します。
351 @param[in] mode モード
352 @return 設定に成功すれば true を、失敗すれば false を返します。
353 */
354 bool SetClippingMode(ClippingMode mode);
355
356 /*!
357 @brief クリッピングモードを取得します。
358 @return モード
359 */
360 ClippingMode GetClippingMode();
361
362 /*! :private
363 @brief ミックス時のリア成分への重みを設定します。サラウンドモードでは無視されます。
364
365 @param[in] depth 重み (0 以上 1 以下の値でなければなりません)
366 @return 設定に成功すれば true を、失敗すれば false を返します。
367 */
368 bool SetRearRatio(f32 depth);
369
370 /*!
371 @brief サラウンドデプスを設定します。
372
373 サラウンドデプスは、スピーカー出力時の 3D サラウンドの効果の大小を
374 表すパラメータです。値が大きい程、効果が大きくなります。
375 サラウンドデプスはヘッドフォン出力時の効果には影響しません。
376
377 デフォルト値は 1.0f です。
378
379 @param[in] depth サラウンドデプス(0 <= depth <= 1.0f)
380 @return 設定に成功すれば true を、失敗すれば false を返します。
381 */
382 bool SetSurroundDepth(f32 depth);
383
384 /*!
385 @brief 3D サラウンドの仮想スピーカー位置を設定します。
386
387 @param[in] pos 仮想スピーカー位置
388 @return 設定に成功すれば true を、失敗すれば false を返します。
389 */
390 bool SetSurroundSpeakerPosition(SurroundSpeakerPosition pos);
391
392 /*! :private
393 @brief 3D サラウンド用空間フィルタを設定します。
394
395 @param[in] pSrc フィルタ係数バッファアドレス
396 @param[in] nCoeffs フィルタのタップ数
397 @return 設定に成功すれば true を、失敗すれば false を返します。
398 */
399 bool SetSurroundSpacialFilter(s16* pSrc, s32 nCoeffs);
400
401 /*! :private
402 @brief 3D サラウンド用方向フィルタを設定します。
403
404 @param[in] pSrc フィルタ係数バッファアドレス
405 @param[in] nCoeffs フィルタのタップ数
406 @param[in] mode モード(NN_SND_DEBUG_3DS_SPEAKER / NN_SND_DEBUG_3DS_HEADPHONE のいずれか)
407 @return 設定に成功すれば true を、失敗すれば false を返します。
408 */
409 bool SetSurroundDirectionFilter(s16* pSrc, s32 nCoeffs, s32 mode);
410
411 /*! :private
412 @brief 3D サラウンド用 IIR フィルタを設定します。
413
414 @param[in] pSrc フィルタ係数バッファアドレス
415 @param[in] nCoeffs フィルタのタップ数
416 @param[in] mode モード(NN_SND_DEBUG_3DS_SPEAKER / NN_SND_DEBUG_3DS_HEADPHONE のいずれか)
417 @return 設定に成功すれば true を、失敗すれば false を返します。
418 */
419 bool SetSurroundIirFilterCoeffs(s32* pSrc, s32 nCoeffs, s32 mode);
420
421 /*! :private
422 @brief 3D サラウンド用 IIR フィルタの On/Off を設定します。
423
424 @param[in] flag true なら On, false なら Off
425 @return 設定に成功すれば true を、失敗すれば false を返します。
426 */
427 bool SetSurroundIirFilterFlag(bool flag);
428
429 /*!
430 @}
431 */
432
433 /*!
434 @brief サウンドが使用できるDSP サイクル数を設定します。
435
436 初期状態ではNN_SND_DSP_MAXIMUM_CYCLES が設定されています。
437 NN_SND_DSP_MAXIMUM_CYCLES 以上の値が入力された場合は
438 NN_SND_DSP_MAXIMUM_CYCLES が設定されます。
439
440 @param[in] cycles サイクル数
441 @return なし。
442 */
443 void SetMaximumDspCycles( s32 cycles );
444
445 /*!
446 @brief サウンドに割り当てているDSP サイクル数を取得します。
447
448 @return サイクル数を返します。
449 */
450 s32 GetMaximumDspCycles();
451
452 /*!
453 @brief 最後のオーディオフレーム作成でDSP が費やしたサイクル数を取得します。
454
455 @return DSP で消費したサイクル数を返します。
456 */
457 s32 GetDspCycles();
458
459 /*! :private
460 @brief snd 処理を一時中断し、終了処理を行います。
461 */
462 void Sleep();
463
464 /*! :private
465 @brief 一時中断した snd の処理を復元します。
466 */
467 void WakeUp();
468
469 /*! :private
470 @brief 終了処理のための準備を行います。
471 */
472 void OrderToWaitForFinalize();
473
474 /*!
475 @brief ヘッドホンの挿入状態を取得します。
476 @return 挿入されている場合は true を返します。
477 */
478 bool GetHeadphoneStatus();
479
480 /*!
481 @brief ヘッドホンの挿入状態を更新し、取得します。
482 @return 挿入されている場合は true を返します。
483 */
484 bool UpdateHeadphoneStatus();
485
486 /*! :private
487 @brief 蓋閉じ時に強制的にヘッドフォン出力にするかどうかを設定します。
488 @param[in] forceout true なら強制ヘッドフォン出力とします。
489 @return 処理の結果が返ります。
490 */
SetHeadphoneOutOnShellClose(bool forceout)491 inline Result SetHeadphoneOutOnShellClose(bool forceout)
492 {
493 return dsp::ForceHeadphoneOut(forceout);
494 }
495
496 /*!
497 @name DSP 最終出力取得
498 @{
499 */
500 /*!
501 @brief Mix バスデータを指定のバッファにコピーします。
502 @param[out] pData Mix バスデータの内容をコピーするバッファアドレス
503 @param[in] nSamplesPerFrame チャンネルあたりのサンプル数(通常は NN_SND_SAMPLES_PER_FRAME を指定します)
504 @return データ取得に成功すれば true を、失敗すれば false を返します。
505 */
506 bool GetMixedBusData(s16* pData, s32 nSamplesPerFrame = NN_SND_SAMPLES_PER_FRAME);
507 /*!
508 @}
509 */
510
511 /*!
512 @name 処理落ち検出
513 @{
514 */
515 /*!
516 @brief 処理落ちしたサウンドフレームの数を取得します。
517 @return 処理落ちしたサウンドフレームの数を返します。
518 */
519 s32 GetDroppedSoundFrameCount();
520
521 /*!
522 @brief 処理落ちしたサウンドフレームの数を初期化します。
523 */
524 void ClearDroppedSoundFrameCount();
525
526 /*!
527 @}
528 */
529
530 /*!
531 @name DSP-ADPCM 関連
532 @{
533 */
534 /*!
535 @brief 16bit PCM データを DSP-ADPCM フォーマットにエンコードします。
536
537 @param[in] pInput 入力バッファアドレス
538 @param[out] pOutput 出力バッファアドレス(4 バイトアラインされている必要があります)
539 @param[in] nSamples 入力サンプル数
540 @param[in] sampleRate サンプル周波数
541 @param[in] loopStart ループ開始サンプル位置(0 オリジン)
542 @param[in] loopEnd ループ終了サンプル位置(0 オリジン)
543 @param[out] pInfo ヘッダ構造体アドレス
544 @return なし
545 */
546 s32 EncodeAdpcmData(s16* pInput, u8* pOutput, s32 nSamples, s32 sampleRate, s32 loopStart, s32 loopEnd, DspsndAdpcmHeader* pInfo);
547
548 /*!
549 @brief DSP-ADPCM データをデコードします。
550
551 @param[in] pInput 入力バッファアドレス
552 @param[out] pOutput 出力バッファアドレス
553 @param[in] param ADPCM パラメータ
554 @param[in] context ADPCM コンテキスト
555 @param[in] nSamples 入力サンプル数
556 */
557 void DecodeAdpcmData(u8* pInput, s16* pOutput, AdpcmParam& param, AdpcmContext& context, s32 nSamples);
558
559 /*!
560 @brief エンコード時に必要な出力バッファのサイズを返します。
561
562 @param[in] nSamples 入力サンプル数
563 @return 出力バッファのサイズ
564 */
565 s32 GetAdpcmOutputBufferSize(s32 nSamples);
566
567 /*!
568 @brief サンプル位置をニブル数に変換します。
569
570 @param[in] nPos サンプル位置
571 @return ニブル数
572 */
573 u32 ConvertAdpcmPos2Nib(u32 nPos);
574 /*!
575 @brief ニブル数をサンプル位置に変換します。
576
577 @param[in] nNib ニブル数
578 @return サンプル位置
579 */
580 u32 ConvertAdpcmNib2Pos(u32 nNib);
581 /*!
582 @}
583 */
584
585 /*!
586 @name エフェクト
587
588 @{
589 */
590
591 /*!
592 @brief ディレイエフェクトを設定します。
593
594 AUX から出力されるデータを加工するには、
595 自前の加工処理関数を @ref RegisterAuxCallback で設定するほか、
596 本関数を用いて、ディレイやリバーブのエフェクトをかけることができます。
597
598 ディレイ (@ref FxDelay) やリバーブ (@ref FxReverb) は、
599 各バスにどちらか 1 つしか設定できないことに注意してください。
600
601 1 つ以上設定すると、後から設定したものが有効になります。
602 もともと設定されていたエフェクトは解除されます。
603
604 @ref ClearEffect を呼び出したり、
605 上記のようにもともと設定されていて解除された場合は、
606 @ref FxDelay::ReleaseWorkBuffer
607 や @ref FxReverb::ReleaseWorkBuffer で、
608 当該エフェクトで使用していたメモリを解放することができます。
609
610 本関数を呼び出す前に、@ref FxDelay クラスの、
611 @ref FxDelay::SetParam, @ref FxDelay::GetRequiredMemSize,
612 @ref FxDelay::AssignWorkBuffer を呼び出し、
613 ディレイエフェクトの準備を済ませておく必要があります。
614
615 @param[in] busId バスの ID
616 @param[in] fx 設定するディレイエフェクト
617
618 @return 設定に成功したら true を返します。
619 fx が NULL の場合、設定に失敗し false を返します。
620
621 @see ClearEffect
622 @see RegisterAuxCallback
623 @see FxDelay クラス
624 @see FxReverb クラス
625 @date 2010/10/20 初版
626 */
627 bool SetEffect(AuxBusId busId, FxDelay* fx);
628
629 /*!
630 @brief リバーブエフェクトを設定します。
631
632 AUX から出力されるデータを加工するには、
633 自前の加工処理関数を @ref RegisterAuxCallback で設定するほか、
634 本関数を用いて、ディレイやリバーブのエフェクトをかけることができます。
635
636 ディレイ (@ref FxDelay) やリバーブ (@ref FxReverb) は、
637 各バスにどちらか 1 つしか設定できないことに注意してください。
638
639 1 つ以上設定すると、後から設定したものが有効になります。
640 もともと設定されていたエフェクトは解除されます。
641
642 @ref ClearEffect を呼び出したり、
643 上記のようにもともと設定されていて解除された場合は、
644 @ref FxDelay::ReleaseWorkBuffer
645 や @ref FxReverb::ReleaseWorkBuffer で、
646 当該エフェクトで使用していたメモリを解放することができます。
647
648 本関数を呼び出す前に、@ref FxReverb クラスの、
649 @ref FxReverb::SetParam, @ref FxReverb::GetRequiredMemSize,
650 @ref FxReverb::AssignWorkBuffer を呼び出し、
651 ディレイエフェクトの準備を済ませておく必要があります。
652
653
654 @param[in] busId バスの ID
655 @param[in] fx 設定するリバーブエフェクト
656
657 @return 設定に成功したら true を返します。
658 fx が NULL の場合、設定に失敗し false を返します。
659 @see ClearEffect
660 @see RegisterAuxCallback
661 @see FxReverb クラス
662 @see FxDelay クラス
663
664 @date 2010/10/20 初版
665 */
666 bool SetEffect(AuxBusId busId, FxReverb* fx);
667
668 /*!
669 @brief エフェクトの設定を解除します。
670
671 @ref SetEffect 関数で設定したエフェクトを解除します。
672
673 @ref RegisterAuxCallback で設定したコールバックは解除されません
674 (これは @ref ClearAuxCallback で解除することができます)。
675
676
677 @param[in] busId バスの ID
678
679 @see SetEffect
680 @see RegisterAuxCallback
681 @see ClearAuxCallback
682
683 @date 2010/10/20 初版
684 */
685 void ClearEffect(AuxBusId busId);
686
687 /*!
688 @}
689 */
690
691 void UseOldSystem(bool enable = true);
692
693 }}} // namespace nn::snd::CTR
694
695 #endif // __cplusplus
696
697 // 以下、C 用宣言
698 /*!
699 @addtogroup nn_snd snd
700
701 @{
702 */
703
704 /*!
705 @brief 対応する C++ 関数 @ref nn::snd::CTR::Initialize を参照してください。
706 */
707 NN_EXTERN_C nnResult nnsndInitialize();
708
709 /*!
710 @}
711 */
712
713 #endif //NN_SND_API_H_
714