SwiftPM으로 C 언어가 포함된 라이브러리 만들기

SwiftPM으로 C 언어가 포함 된 라이브러리를 만들었습니다.


  • C++로 작성된 음성 분석 합성 시스템 WORLD의 Swift 래퍼 인 WorldInApple을 작성 중입니다.


  • Swift Package Manager에 해당하는 이야기입니다.

  • 동작의 모습

    world의 swift의 wrapper를 공개했습니다 - iPhone에서 보이첸을 할 수 있습니다! htps // t. 코/t2Y3Bvhvぃ 피 c. 라고 r. 이 m/b7아이 4F1Qkr — 후지키 (@fzkqi) February 17, 2020

  • Vocoder 자체의 이야기는 이쪽





  • WorldInApple 구현



    했던 일



    • 공식 문서의 Creating C Language Targets와 같습니다
    • C++로 구현 된 World 본문의 대상을 만들고 Swift 래퍼의 대상에서 종속했습니다.


    Package.swift



    ->htps : // 기주 b. 이 m/후지키/를 rlぢ나 pぇ/bぉb/로 수 ft



    import PackageDescription
    
    let package = Package(
        name: "WorldInApple",
        platforms: [.iOS(.v11), .macOS(SupportedPlatform.MacOSVersion.v10_15)],
        products: [
            .library(
                name: "WorldInApple",
                targets: ["WorldInApple"]),
        ],
        targets: [
            // C++ で書かれた、World 本体
            .target(
                name: "WorldLib"
            ),
            // WorldLib の Swift ラッパー
            .target(
                name: "WorldInApple",
                dependencies: ["WorldLib"]),  // WorldLib に依存
        ]
    )
    




    WorldLib





    WorldLib/include/World.h



    ->htps : // 기주 b. 이 m/후지키/를 rlぢ나 pぇ/bぉb/로 ゔぇぉp/그래서 s/를 rlddb/인 cぅ로/를 rld. h



    • WorldLib의 공개 헤더입니다.
    • World에 필요한 헤더를 게시하고 있습니다


    #import "../world/dio.h"
    #import "../world/stonemask.h"
    #import "../world/cheaptrick.h"
    #import "../world/d4c.h"
    #import "../world/synthesis.h"
    #import "../world/harvest.h"
    #import "../world/synthesisrealtime.h"
    #import "../world/matlabfunctions.h"
    


    WorldInApple



    • WorldLib의 Swift 래퍼입니다
    • import WorldLib World로 정의 된 기능을 사용할 수 있습니다.


    ->htps : // 기주 b. 코 m / 후지 키 / rl ぢ p / b b Shichi s Chima와 r. 수 ft



    import WorldLib
    
    public class AperiodicityEstimator: WorldInAppleComponents {
        private var d4cOption = D4COption() // World で定義された構造体が利用できる
        //〜中略〜
        public func estimatAperiodicity(x: UnsafeMutablePointer<Double>, x_length: Int32) {
            // World で定義された関数が利用できる
            D4C(x, x_length, Int32(parameters.fs), parameters.time_axis, parameters.f0, Int32(parameters.f0_length), Int32(parameters.fft_size), &d4cOption, parameters.aperiodicity)
        }
    }
    


    샘플 구현(Examples)



    • WorldInApple 패키지에서 참조되지 않도록 더미 Package.swift를 배치했습니다.



    ->htps : // 기주 b. 이 m/후지키/를 rlぢ나 pぇ/bぉb/로 수 ft



    import PackageDescription
    
    let package = Package(
      name: "dummy",
      products: [],
      targets: []
    )
    


    • WorldInApple.xcworkspace에서 실행 가능
    • Examples 프로젝트와 WorldInApple 패키지가 들어 있습니다.




    • Examples 타겟으로부터 WorldInApple를 참조합니다.




    • import WorldInApple 이렇게하면 만든 World Swift 래퍼를 사용할 수 있습니다


    ->htps : // 기주 b. 이 m/후지키/를 rlぢ나 pぇ/bぉb/로 수 ft



    import AVFoundation
    import Combine
    import Foundation
    import SwiftUI
    import WorldInApple
    
    class ContentViewModel: ObservableObject {
    
        private let world = WorldInApple(fs: 48000, frame_period: 5, x_length: 38400)
        // 〜中略〜
    }
    


    게시 & 사용



    • GitHub에 push하여 pure swift 패키지와 마찬가지로 사용할 수있었습니다.

    좋은 웹페이지 즐겨찾기